5261
V2EX  ›  Rust

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

  •  
  •   5261 · Dec 27, 2024 · 12819 views
    This topic created in 677 days ago, the information mentioned may be changed or developed.

    举个例子

    闭包

    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 是所有语言中把符号运用到极致的语言!

    继续苟着看下去!

    Supplement 1  ·  Dec 27, 2024
    求打醒

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

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

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

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

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

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

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

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

    type bound 是很好理解的!

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

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

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

    尤其是作为 Java 开发,大部分项目都是正常的 OOP ,但是有些项目还非得 DDD 模式搞,然后再把项目集成起来,那种感觉是真的酸爽!
    Greendays
    Greendays
    Dec 27, 2024
    36
    JAVA 的恩情还不完
    leonshaw
    leonshaw
    Dec 27, 2024 via Android
    37
    写个容器都要 unsafe ,以后会像 C++一样,分成写库的和用库的两种语言
    PUR4uF5Oq0z0YN9r
    PUR4uF5Oq0z0YN9r
    Dec 27, 2024
    38
    愚蠢的常规做法都是把简单问题复杂化
    clino
    clino
    Dec 27, 2024
    39
    让 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
    jianyang
    Dec 27, 2024❤️1
    40
    想想幸好 GO 团队力排众议就是不加任何语法糖、即便不懂 GO 的,看 GO 代码也能大概知道在做什么
    rust 这边就离谱了、简单的代码段还能勉强看的懂、复杂的代码一坨一坨的,另外感觉 rust 的符号键盘都快不够按了-。-
    shui14
    shui14
    Dec 27, 2024
    41
    它适合系统编程,写业务应该选 go
    Dorian101
    Dorian101
    Dec 27, 2024
    42
    C#的恩情还不完
    diivL
    diivL
    Dec 27, 2024❤️1
    43
    @Livid #39 AI
    xz410236056
    xz410236056
    Dec 27, 2024
    44
    @jellen #34 不管怎样,比 OC 那坨是强
    lifei6671
    lifei6671
    Dec 27, 2024
    45
    @virusdefender 实际上开发中写的很不自信,不知道自己的写法到底有没有问题。
    5261
    5261
    OP
    Dec 27, 2024
    46
    @jianyang “感觉 rust 的符号键盘都快不够按了” 你说了我很想表达的话
    gimp
    gimp
    Dec 27, 2024❤️1
    47
    @diivL 不了解 V 站不能发送 AI 生成内容的同学也有不少,建议不是故意使用 AI 无意义回帖的,先 AT 下 @clino 提醒比较好
    clino
    clino
    Dec 27, 2024
    48
    @gimp 感谢提醒,不知道有这个规矩,下次如果要发这种应该弄个 gist 再在这里发链接之类的
    5261
    5261
    OP
    Dec 27, 2024
    49
    @shui14 有的时候我也怀疑自己选择 Rust 当做第二语言的决定是对还是错的!一开始我是学 Go 的,后来看了下 电鸭、或者远程工作大部分都是 web3 相关的岗位,所以才看到 Rust ,就投入到学习中去了!
    StarsunYzL
    StarsunYzL
    Dec 27, 2024
    50
    还好吧,早年刚入行时第一次见到 boost::xpressive 用 C++模板实现的静态正则表达式我 CPU 都被干烧了,一般的正则:

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

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

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

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

    self.proc.lock().unwrap().as_ref().unwrap().clone()
    chenxuuu
    chenxuuu
    Dec 27, 2024
    52
    @5261 #13 最后用起来最舒适的还得是 C#哈哈哈
    leon1
    leon1
    Dec 27, 2024
    53
    rust 这种如果不降低入门门槛,那这个语言是很难发展起来的
    xgdgsc
    xgdgsc
    Dec 27, 2024
    54
    https://users.rust-lang.org/about 可以比较这种 user signup/active user 比率判断难度, https://discourse.julialang.org/about https://elixirforum.com/about .可惜 discourse 升级把最近 30 天的升级没了,只有 7 天的了
    yplam
    yplam
    Dec 27, 2024 via Android
    55
    写一下 Future, 写一下 Stream, 你就会发现这都不是事
    PTLin
    PTLin
    Dec 27, 2024
    56
    你都开始求打醒了,那我也只能说别学了。
    一是 rust 本身就业市场就不行。
    二是这闭包才哪到哪,借用规则,重借用,nll ,生命周期的变性,unsafe ,async 底层原理,哪个都够你喝一壶。
    所以真是为了找工作,不是为了 just for fun 真的建议趁早弃坑。
    AV1
    AV1
    Dec 27, 2024
    57
    rust 的竞品是 c c++,c c++的使用场景有多复杂,rust 也就有多复杂。
    如果你平时都是写 go java js python 做业务开发的,自然会觉得 rust 很复杂。
    300
    300
    Dec 27, 2024 via Android
    58
    @xfn 我用 ai 改写了我的一个工具,里面就很多这种代码。我很想简化,但是搞不明白
    原来真的就是这种语法啊…
    7uSK0CV63kJdhp0M
    7uSK0CV63kJdhp0M
    Dec 28, 2024
    59
    @StarsunYzL
    >> 是 什么意思 ?
    1Z3KYa0qBLvei98o
    1Z3KYa0qBLvei98o
    Dec 28, 2024 via iPhone
    60
    @w568w 这不挺好,学术圈的太复杂,工业界的垫垫脚能上?
    1Z3KYa0qBLvei98o
    1Z3KYa0qBLvei98o
    Dec 28, 2024 via iPhone
    61
    @PTLin 国内还要很多年,除非能进教材
    w568w
    w568w
    Dec 28, 2024
    62
    @VchentozV 是。反过来说,Rust 是工业界语言里汇聚了最多近年来学术成果的,也是学术界语言里唯一有实际落地应用的。
    1Z3KYa0qBLvei98o
    1Z3KYa0qBLvei98o
    Dec 28, 2024 via iPhone
    63
    @w568w scala haskell 啥的有多少落地的?
    esile
    esile
    Dec 29, 2024
    64
    野生程序员表示太难了
    5261
    5261
    OP
    Dec 30, 2024
    65
    @PTLin Rust 只是作为第二语言来学习,不作为工作语言,不过不排除后面会用来作为来找远程工作的语言!

    那我就先继续看完第二遍之后再做决策吧!
    5261
    5261
    OP
    Dec 30, 2024
    66
    @DOLLOR 懂了,感谢解惑!
    GoNewEra
    GoNewEra
    Jan 3, 2025
    67
    又想学 rust 了 ,楼主用的什么教程?
    5261
    5261
    OP
    Jan 3, 2025
    68
    @GoNewEra 有其他选择就做其他选择吧,没啥教程,我就只看了官方教程
    PTLin
    PTLin
    Jan 5, 2025
    69
    @5261 官方教程的 the book 是最垃圾的,我当初就是看 the book 三遍加上 Rust by Example 才学明白。但是现在推荐你这本 https://book.douban.com/subject/36547630/
    5261
    5261
    OP
    Jan 6, 2025
    70
    @PTLin 收到,这本书我也买了,初看这本书感觉排版布局有点乱,等我看完第二轮 the book 再回过头来看这本书
    qNN108
    qNN108
    Jan 7, 2025
    71
    rust 都没工作岗位,真值得学吗?
    5261
    5261
    OP
    Jan 7, 2025
    72
    @qNN108 为爱发电学习~ 作为第二语言或者了解其他语言可以学,如果为了找工作算了!
    Xerxes2
    Xerxes2
    Jan 9, 2025
    73
    多写,写多了就懂为什么要这么设计了,背后都是有理由的
    IIInsomnia
    IIInsomnia
    Jan 17, 2025
    74
    @PTLin 正解,我也是看这本书学会的
    CyouYamato
    CyouYamato
    Mar 17, 2025
    75
    啥? 看着简单就是好理解?来看看这个:
    let i = 0;
    if let 0 = i {
    println!("zero");
    }
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   4945 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 306ms · UTC 06:18 · PVG 14:18 · LAX 22:18 · JFK 01:18
    ♥ Do have faith in what you're doing.