V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
5261
V2EX  ›  Rust

rust 大抵是病了,它担心大家太容易掌握了

  •  
  •   5261 · 1 天前 · 6090 次点击

    举个例子

    闭包

    fn  add_one_v1   (x: u32) -> u32 { x + 1 }
    let add_one_v2 = |x: u32| -> u32 { x + 1 };
    let add_one_v3 = |x|             { x + 1 };
    let add_one_v4 = |x|               x + 1  ;
    

    初看确实好理解,也能掌握,就算再加上

    immutable 、mutable 、move 也能理解

    但是再 加上边界 、FnOnce 、Fnmut 这些就给我整不会了,干懵逼了

    impl<T> Option<T> {
        pub fn unwrap_or_else<F>(self, f: F) -> T
        where
            F: FnOnce() -> T
        {
            match self {
                Some(x) => x,
                None => f(),
            }
        }
    }
    

    我只想说 rust 是所有语言中把符号运用到极致的语言!

    继续苟着看下去!

    第 1 条附言  ·  23 小时 23 分钟前
    求打醒

    有的时候我也怀疑自己选择 Rust 当做第二语言的决定是对还是错的!

    一开始我是学 Go 的,后来看了下 电鸭、或者远程工作大部分都是 web3 相关的岗位,才看到 Rust ,所以就投入到学习中去了!
    59 条回复    2024-12-28 11:12:27 +08:00
    PTLin
        1
    PTLin  
       1 天前
    Fn 系列 trait 初学者难以掌握,大概就是因为不知道 Fn 系列闭包编译器的具体展开形式才不理解一些报错。
    InkStone
        2
    InkStone  
       1 天前
    除了涉及所有权语义的东西以外,都是其他语言有的东西吧。闭包和闭包类型、可省略类型和括号、泛型和泛型约束。

    要说符号运用到极致还是去看 Scala 吧,Rust 比 Scala 简单多了。
    FreeWong
        3
    FreeWong  
       1 天前   ❤️ 3
    真的需要一个内存安全的语言,但是觉得不应该是 rust
    5261
        4
    5261  
    OP
       1 天前
    @InkStone Scala 之前没深入学习过、不太清楚! 我自己是 Java 开发、Rust 作为第二语言学习!看第一遍的时候真是让我头皮发麻,现在回个头看第二遍的时候压力稍微小些,可能没有实际编码的原因或者用的少原因,感觉 Rust 的符号编程真是比 Java 复杂多了
    w568w
        5
    w568w  
       1 天前
    Rust 的语法特性属于两头卡,工业界的人一看到 Trait 、Bound 、Variance 这些头都大了:啥啥啥,这都写的啥;学术界的人还觉得 Rust 得多练练,一个 Higher rank trait bounds for closure 到现在都没写出来: https://github.com/rust-lang/rust/issues/97362

    @FreeWong 「内存安全」的语言,从 Java 开始基本就都是了。
    chenxuuu
        6
    chenxuuu  
       1 天前
    对于被 c/cpp 语言摧残过的人来说很好理解这些设计的原因,对于每天用带 GC 语言的程序员来说就不太好理解了
    我学的比较杂,感觉还好,因为 rust 语法真的不算是最奇葩的
    InkStone
        7
    InkStone  
       1 天前
    @5261 其实可能是因为 Java 太简单了。Java 应该是常用语言里最简单的一个,其它常用语言都比 Java 复杂。
    jellen
        8
    jellen  
       1 天前
    所以我选了 swift
    i979491586
        9
    i979491586  
       1 天前
    @jellen Swift 也得了这病,越来月复杂。
    chenjau
        10
    chenjau  
       1 天前
    感觉这种破玩意的读者应该是机器, 而不是人类
    565656
        11
    565656  
       1 天前
    windows 现在有些组件已经慢慢用 rust 在重构了,linux 哪边听说 c 和 rust 还打得不可开交
    Leviathann
        12
    Leviathann  
       1 天前
    Fn FnOnce FnMut 是就是考虑参数 ownership 下的闭包
    type bound 不就是 T extends 吗
    kotlin 一样也可以写 fun <T> test(a: T) where T : Number
    5261
        13
    5261  
    OP
       1 天前
    @chenxuuu 可能我大部分时间都在用 Java 开发、其他语言用的少! Python 以前还学过、用过,Go 也了解过没实战经验、这几年才开始陆续接触一些其他语言!

    大部分时候都是因为没有实际编码经验或者工作环境的原因导致很多新学的语言都这么荒废了!也怪自己没有坚持!
    cmdOptionKana
        14
    cmdOptionKana  
       1 天前   ❤️ 1
    rust 是用来取代 c/cpp 的。

    在语言层面,C 是最简单的,那为什么还要发明 cpp 和 rust ?因为语言简单,需求却不简单,用最简单的语言去实现最复杂的需求,能把人搞疯,因此才需要极度复杂的 cpp 。

    简而言之,如果你嫌弃 rust 复杂,那去使用 cpp ,也半斤八两,还是复杂到爆。

    但大多数情况,用 rust 是杀鸡用屠龙刀,你说屠龙刀不好用,废话,用来杀鸡当然不好用。
    5261
        15
    5261  
    OP
       1 天前
    @Leviathann
    嗯 Fn FnOnce FnMut 看完后感觉就像 参数类型是闭包

    type bound 是很好理解的!

    学 Rust 语法的时候 ,我都是对照着 Java ,看它和 Java 哪种类似,这样学起来没那么累
    wupeaking
        16
    wupeaking  
       1 天前
    emm 是有点复杂, 而且很多教程也没讲得明白, 我都是把闭包当场被编译器自动构建的的结构体,至于里面对上下文变量是拥有,还是借用就根据实际情况分析。这样去理解 Fn,FnOnce,Fnmut 的话,反正能解释的通。

    个人觉得这个语言挺难火起来的,我反正是学了 2 遍才入门,学到第 3 遍的时候才能自己独立用自己的想法实现链表,树这些常见的数据结构。
    securityCoding
        17
    securityCoding  
       1 天前
    @InkStone #2 scala 可没有那么多花里胡哨的符号
    securityCoding
        18
    securityCoding  
       1 天前
    日常项目需要维护 python,java,scala,c++,go 项目 ,最爽的就是 go 能让我心情愉悦那种
    openmynet
        19
    openmynet  
       1 天前
    @5261 你对照着 java 来看,自然会觉得复杂,如果你一开始是写 js 的,而且还是 es5 的版本,在还没有没有 ts 来写一些复杂的 js 应用时,会发现 rs 的类型系统的和生命周期机制是真香。不用担心未知的内存泄露把浏览器卡到爆炸,不用担心某些变量的值莫名其妙的被修改了,甚至在调用某些插件时,明明已经进行释放操作了,内存占用还是没降下来。
    从我的角度上看,rs 是比 ts 进化的更彻底的 js 。另外 js 和 rs 是同一个作者,所有在 rs 身上有一部分 js 的身影。
    virusdefender
        20
    virusdefender  
       1 天前
    我年初开始写,写了一年 rust 了,我的看法是:只看教程确实很复杂,但是如果你有一个实际的项目上手去写,很快就会理解为何要这样了,写一些常见的工程的话,很多复杂的概念和语法很少用到,暂时不懂也没问题。
    xtreme1
        21
    xtreme1  
       1 天前
    如果只解决写起来没 Java 爽, 全程 Box<T> Rc<RefCell<T>> Arc<Mutex<T>> 又不是不行, 反正性能你大概不需要
    dacapoday
        22
    dacapoday  
       1 天前
    rust 的内存安全也只能适合简单的同步场景。一旦异步或 arena 等只能运行时确定生命周期的地方,代码要么晦涩难改,要么引入简易 GC ,局部 unsafe ,回退到 C++的情况。
    adoal
        23
    adoal  
       1 天前
    @FreeWong 内存安全的语言太多了,但是如果想要内存安全又想要避开 GC ,那,基于“你不能既要又要还要”的道理,总要付出更致命的牺牲才能得到
    Rickkkkkkk
        24
    Rickkkkkkk  
       1 天前
    这种真的易读吗...
    zeuss
        25
    zeuss  
       1 天前   ❤️ 10
    语法糖尿病
    InkStone
        26
    InkStone  
       1 天前
    @xtreme1 就算做了 type alias 还是挺不爽 的,因为调的时候需要手动解一次包。

    等什么时候自动解包实装就真爽了。
    InkStone
        27
    InkStone  
       1 天前
    @securityCoding Scala 能用自定义符号做操作符,论花里胡哨是真的没人能跟它比
    xz410236056
        28
    xz410236056  
       1 天前
    @jellen 别的吹吹算了,逃逸、非逃逸、自动闭包、尾随,还有缺省值的使用,swift 的关键词和用法足够单独写本书
    xdeng
        29
    xdeng  
       1 天前   ❤️ 2
    go 能让我心情愉悦
    OBJECTION
        30
    OBJECTION  
       1 天前
    一直写 c++ 这些语法 还好吧。。 我之前一个同事写代码还贼喜欢套模板。。
    lucifer9
        31
    lucifer9  
       1 天前 via iPhone
    c 艹的模版,go 的范型,zig 的指针解引用,写出来哪个是好看的
    ratazzi
        32
    ratazzi  
       1 天前 via iPhone
    你再去看看生命周期
    yolee599
        33
    yolee599  
       1 天前 via Android   ❤️ 4
    学过一遍 rust ,让我觉得 C 真的太好了,线程,信号量,互斥量,链表,指针,尽情的使用,就像进了一间满屋子工具的房子,做啥都行,还能交叉编译成各种系统的库,跑在 x86 上,arm 上,risc-v 上,8051 上,通通没问题,编译出来的符号就是函数名,一看就懂,这才是大道至简😁
    jellen
        34
    jellen  
       1 天前
    @xz410236056 把 ARC ,循环引用啥的了解下,基本使用没问题,用着还行;
    高阶语法连喵神都头疼,确实越来越复杂,不过貌似新版有简化初学者使用的 flag
    5261
        35
    5261  
    OP
       1 天前
    @yolee599 是的,写代码到最后我觉得还是简单点好,至少要让人看的懂

    尤其是作为 Java 开发,大部分项目都是正常的 OOP ,但是有些项目还非得 DDD 模式搞,然后再把项目集成起来,那种感觉是真的酸爽!
    Greendays
        36
    Greendays  
       1 天前
    JAVA 的恩情还不完
    leonshaw
        37
    leonshaw  
       1 天前 via Android
    写个容器都要 unsafe ,以后会像 C++一样,分成写库的和用库的两种语言
    sky3hao
        38
    sky3hao  
       1 天前
    愚蠢的常规做法都是把简单问题复杂化
    clino
        39
    clino  
       1 天前
    让 AI 解释一下,不过我不会 rust ,看得还不是很懂,楼主看看有没有帮助

    ```
    // 这是一个 Rust 语言中 Option 类型的 unwrap_or_else 方法实现
    // 它用于在 Option 为 Some 时返回其值,为 None 时执行传入的闭包并返回其结果
    // 这个函数的主要用途是提供一种安全的方式来处理可能为 None 的 Option 值,同时允许在 None 情况下执行自定义逻辑

    // 为泛型类型 Option<T>实现方法
    impl<T> Option<T> {
    // 定义公共方法 unwrap_or_else ,接受一个闭包 f 作为参数
    pub fn unwrap_or_else<F>(self, f: F) -> T
    where
    // 约束 F 必须是一个 FnOnce 闭包,且返回类型为 T
    F: FnOnce() -> T
    {
    // 使用 match 匹配 self (当前 Option 实例)
    match self {
    // 如果是 Some(x),直接返回 x
    Some(x) => x,
    // 如果是 None ,执行闭包 f 并返回其结果
    None => f(),
    }
    }
    }

    // 使用示例:
    fn main() {
    let some_value: Option<i32> = Some(42);
    let none_value: Option<i32> = None;

    // 当 Option 为 Some 时,直接返回值
    let result1 = some_value.unwrap_or_else(|| {
    println!("Some case");
    0
    });
    println!("Result1: {}", result1); // 输出: 42

    // 当 Option 为 None 时,执行闭包返回默认值
    let result2 = none_value.unwrap_or_else(|| {
    println!("None case");
    0
    });
    println!("Result2: {}", result2); // 输出: 0
    }
    ```
    jianyang
        40
    jianyang  
       1 天前
    想想幸好 GO 团队力排众议就是不加任何语法糖、即便不懂 GO 的,看 GO 代码也能大概知道在做什么
    rust 这边就离谱了、简单的代码段还能勉强看的懂、复杂的代码一坨一坨的,另外感觉 rust 的符号键盘都快不够按了-。-
    shui14
        41
    shui14  
       1 天前
    它适合系统编程,写业务应该选 go
    Dorian101
        42
    Dorian101  
       23 小时 54 分钟前
    C#的恩情还不完
    diivL
        43
    diivL  
       23 小时 54 分钟前   ❤️ 1
    @Livid #39 AI
    xz410236056
        44
    xz410236056  
       23 小时 51 分钟前
    @jellen #34 不管怎样,比 OC 那坨是强
    lifei6671
        45
    lifei6671  
       23 小时 43 分钟前
    @virusdefender 实际上开发中写的很不自信,不知道自己的写法到底有没有问题。
    5261
        46
    5261  
    OP
       23 小时 39 分钟前
    @jianyang “感觉 rust 的符号键盘都快不够按了” 你说了我很想表达的话
    gimp
        47
    gimp  
       23 小时 29 分钟前   ❤️ 1
    @diivL 不了解 V 站不能发送 AI 生成内容的同学也有不少,建议不是故意使用 AI 无意义回帖的,先 AT 下 @clino 提醒比较好
    clino
        48
    clino  
       23 小时 25 分钟前
    @gimp 感谢提醒,不知道有这个规矩,下次如果要发这种应该弄个 gist 再在这里发链接之类的
    5261
        49
    5261  
    OP
       23 小时 25 分钟前
    @shui14 有的时候我也怀疑自己选择 Rust 当做第二语言的决定是对还是错的!一开始我是学 Go 的,后来看了下 电鸭、或者远程工作大部分都是 web3 相关的岗位,所以才看到 Rust ,就投入到学习中去了!
    StarsunYzL
        50
    StarsunYzL  
       23 小时 18 分钟前
    还好吧,早年刚入行时第一次见到 boost::xpressive 用 C++模板实现的静态正则表达式我 CPU 都被干烧了,一般的正则:

    string reg = "<(\\w+)>.*?</\\1>";

    用 xpressive 写成等效的静态正则(编译期正则)是这样的:。。。。

    sregex sre = '<' >> (s1= +_w) >> '>' >> -*_ >> "</" >> s1 >> '>';

    C++模板竟然还能实现这种功能,我都惊呆了,C++用有限的标准却能实现的各种奇葩语法和功能的上限实在是太高了
    xfn
        51
    xfn  
       22 小时 9 分钟前
    一下午都在写类似这样的代码

    self.proc.lock().unwrap().as_ref().unwrap().clone()
    chenxuuu
        52
    chenxuuu  
       21 小时 32 分钟前
    @5261 #13 最后用起来最舒适的还得是 C#哈哈哈
    leon1
        53
    leon1  
       20 小时 53 分钟前
    rust 这种如果不降低入门门槛,那这个语言是很难发展起来的
    xgdgsc
        54
    xgdgsc  
       20 小时 1 分钟前
    https://users.rust-lang.org/about 可以比较这种 user signup/active user 比率判断难度, https://discourse.julialang.org/about https://elixirforum.com/about .可惜 discourse 升级把最近 30 天的升级没了,只有 7 天的了
    yplam
        55
    yplam  
       17 小时 18 分钟前 via Android
    写一下 Future, 写一下 Stream, 你就会发现这都不是事
    PTLin
        56
    PTLin  
       17 小时 10 分钟前
    你都开始求打醒了,那我也只能说别学了。
    一是 rust 本身就业市场就不行。
    二是这闭包才哪到哪,借用规则,重借用,nll ,生命周期的变性,unsafe ,async 底层原理,哪个都够你喝一壶。
    所以真是为了找工作,不是为了 just for fun 真的建议趁早弃坑。
    DOLLOR
        57
    DOLLOR  
       16 小时 15 分钟前
    rust 的竞品是 c c++,c c++的使用场景有多复杂,rust 也就有多复杂。
    如果你平时都是写 go java js python 做业务开发的,自然会觉得 rust 很复杂。
    winterbells
        58
    winterbells  
       16 小时 12 分钟前 via Android
    @xfn 我用 ai 改写了我的一个工具,里面就很多这种代码。我很想简化,但是搞不明白
    原来真的就是这种语法啊…
    zhouyin
        59
    zhouyin  
       3 小时 5 分钟前
    @StarsunYzL
    >> 是 什么意思 ?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2846 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 06:18 · PVG 14:18 · LAX 22:18 · JFK 01:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.