举个例子
闭包
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
PTLin 16 小时 44 分钟前
Fn 系列 trait 初学者难以掌握,大概就是因为不知道 Fn 系列闭包编译器的具体展开形式才不理解一些报错。
|
2
InkStone 16 小时 39 分钟前
除了涉及所有权语义的东西以外,都是其他语言有的东西吧。闭包和闭包类型、可省略类型和括号、泛型和泛型约束。
要说符号运用到极致还是去看 Scala 吧,Rust 比 Scala 简单多了。 |
3
FreeWong 16 小时 35 分钟前 3
真的需要一个内存安全的语言,但是觉得不应该是 rust
|
4
5261 OP @InkStone Scala 之前没深入学习过、不太清楚! 我自己是 Java 开发、Rust 作为第二语言学习!看第一遍的时候真是让我头皮发麻,现在回个头看第二遍的时候压力稍微小些,可能没有实际编码的原因或者用的少原因,感觉 Rust 的符号编程真是比 Java 复杂多了
|
5
w568w 16 小时 30 分钟前
Rust 的语法特性属于两头卡,工业界的人一看到 Trait 、Bound 、Variance 这些头都大了:啥啥啥,这都写的啥;学术界的人还觉得 Rust 得多练练,一个 Higher rank trait bounds for closure 到现在都没写出来: https://github.com/rust-lang/rust/issues/97362
@FreeWong 「内存安全」的语言,从 Java 开始基本就都是了。 |
6
chenxuuu 16 小时 29 分钟前
对于被 c/cpp 语言摧残过的人来说很好理解这些设计的原因,对于每天用带 GC 语言的程序员来说就不太好理解了
我学的比较杂,感觉还好,因为 rust 语法真的不算是最奇葩的 |
8
jellen 16 小时 26 分钟前
所以我选了 swift
|
9
i979491586 16 小时 24 分钟前
@jellen Swift 也得了这病,越来月复杂。
|
10
chenjau 16 小时 23 分钟前
感觉这种破玩意的读者应该是机器, 而不是人类
|
11
565656 16 小时 22 分钟前
windows 现在有些组件已经慢慢用 rust 在重构了,linux 哪边听说 c 和 rust 还打得不可开交
|
12
Leviathann 16 小时 19 分钟前
Fn FnOnce FnMut 是就是考虑参数 ownership 下的闭包
type bound 不就是 T extends 吗 kotlin 一样也可以写 fun <T> test(a: T) where T : Number |
13
5261 OP @chenxuuu 可能我大部分时间都在用 Java 开发、其他语言用的少! Python 以前还学过、用过,Go 也了解过没实战经验、这几年才开始陆续接触一些其他语言!
大部分时候都是因为没有实际编码经验或者工作环境的原因导致很多新学的语言都这么荒废了!也怪自己没有坚持! |
14
cmdOptionKana 16 小时 16 分钟前 1
rust 是用来取代 c/cpp 的。
在语言层面,C 是最简单的,那为什么还要发明 cpp 和 rust ?因为语言简单,需求却不简单,用最简单的语言去实现最复杂的需求,能把人搞疯,因此才需要极度复杂的 cpp 。 简而言之,如果你嫌弃 rust 复杂,那去使用 cpp ,也半斤八两,还是复杂到爆。 但大多数情况,用 rust 是杀鸡用屠龙刀,你说屠龙刀不好用,废话,用来杀鸡当然不好用。 |
15
5261 OP @Leviathann
嗯 Fn FnOnce FnMut 看完后感觉就像 参数类型是闭包 type bound 是很好理解的! 学 Rust 语法的时候 ,我都是对照着 Java ,看它和 Java 哪种类似,这样学起来没那么累 |
16
wupeaking 16 小时 12 分钟前
emm 是有点复杂, 而且很多教程也没讲得明白, 我都是把闭包当场被编译器自动构建的的结构体,至于里面对上下文变量是拥有,还是借用就根据实际情况分析。这样去理解 Fn,FnOnce,Fnmut 的话,反正能解释的通。
个人觉得这个语言挺难火起来的,我反正是学了 2 遍才入门,学到第 3 遍的时候才能自己独立用自己的想法实现链表,树这些常见的数据结构。 |
17
securityCoding 16 小时 12 分钟前
@InkStone #2 scala 可没有那么多花里胡哨的符号
|
18
securityCoding 16 小时 10 分钟前
日常项目需要维护 python,java,scala,c++,go 项目 ,最爽的就是 go 能让我心情愉悦那种
|
19
openmynet 15 小时 56 分钟前
@5261 你对照着 java 来看,自然会觉得复杂,如果你一开始是写 js 的,而且还是 es5 的版本,在还没有没有 ts 来写一些复杂的 js 应用时,会发现 rs 的类型系统的和生命周期机制是真香。不用担心未知的内存泄露把浏览器卡到爆炸,不用担心某些变量的值莫名其妙的被修改了,甚至在调用某些插件时,明明已经进行释放操作了,内存占用还是没降下来。
从我的角度上看,rs 是比 ts 进化的更彻底的 js 。另外 js 和 rs 是同一个作者,所有在 rs 身上有一部分 js 的身影。 |
20
virusdefender 15 小时 54 分钟前
我年初开始写,写了一年 rust 了,我的看法是:只看教程确实很复杂,但是如果你有一个实际的项目上手去写,很快就会理解为何要这样了,写一些常见的工程的话,很多复杂的概念和语法很少用到,暂时不懂也没问题。
|
21
xtreme1 15 小时 51 分钟前
如果只解决写起来没 Java 爽, 全程 Box<T> Rc<RefCell<T>> Arc<Mutex<T>> 又不是不行, 反正性能你大概不需要
|
22
dacapoday 15 小时 50 分钟前
rust 的内存安全也只能适合简单的同步场景。一旦异步或 arena 等只能运行时确定生命周期的地方,代码要么晦涩难改,要么引入简易 GC ,局部 unsafe ,回退到 C++的情况。
|
24
Rickkkkkkk 15 小时 46 分钟前
这种真的易读吗...
|
25
zeuss 15 小时 34 分钟前 10
语法糖尿病
|
27
InkStone 15 小时 29 分钟前
@securityCoding Scala 能用自定义符号做操作符,论花里胡哨是真的没人能跟它比
|
28
xz410236056 15 小时 17 分钟前
@jellen 别的吹吹算了,逃逸、非逃逸、自动闭包、尾随,还有缺省值的使用,swift 的关键词和用法足够单独写本书
|
29
xdeng 15 小时 14 分钟前 1
go 能让我心情愉悦
|
30
OBJECTION 14 小时 58 分钟前
一直写 c++ 这些语法 还好吧。。 我之前一个同事写代码还贼喜欢套模板。。
|
31
lucifer9 14 小时 34 分钟前 via iPhone
c 艹的模版,go 的范型,zig 的指针解引用,写出来哪个是好看的
|
32
ratazzi 13 小时 54 分钟前 via iPhone
你再去看看生命周期
|
33
yolee599 13 小时 49 分钟前 via Android 4
学过一遍 rust ,让我觉得 C 真的太好了,线程,信号量,互斥量,链表,指针,尽情的使用,就像进了一间满屋子工具的房子,做啥都行,还能交叉编译成各种系统的库,跑在 x86 上,arm 上,risc-v 上,8051 上,通通没问题,编译出来的符号就是函数名,一看就懂,这才是大道至简😁
|
34
jellen 13 小时 39 分钟前
@xz410236056 把 ARC ,循环引用啥的了解下,基本使用没问题,用着还行;
高阶语法连喵神都头疼,确实越来越复杂,不过貌似新版有简化初学者使用的 flag |
35
5261 OP @yolee599 是的,写代码到最后我觉得还是简单点好,至少要让人看的懂
尤其是作为 Java 开发,大部分项目都是正常的 OOP ,但是有些项目还非得 DDD 模式搞,然后再把项目集成起来,那种感觉是真的酸爽! |
36
Greendays 13 小时 15 分钟前
JAVA 的恩情还不完
|
37
leonshaw 13 小时 8 分钟前 via Android
写个容器都要 unsafe ,以后会像 C++一样,分成写库的和用库的两种语言
|
38
sky3hao 13 小时 1 分钟前
愚蠢的常规做法都是把简单问题复杂化
|
39
clino 12 小时 53 分钟前
让 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 } ``` |
40
jianyang 12 小时 49 分钟前
想想幸好 GO 团队力排众议就是不加任何语法糖、即便不懂 GO 的,看 GO 代码也能大概知道在做什么
rust 这边就离谱了、简单的代码段还能勉强看的懂、复杂的代码一坨一坨的,另外感觉 rust 的符号键盘都快不够按了-。- |
41
shui14 12 小时 40 分钟前
它适合系统编程,写业务应该选 go
|
42
Dorian101 12 小时 32 分钟前
|
44
xz410236056 12 小时 29 分钟前
@jellen #34 不管怎样,比 OC 那坨是强
|
45
lifei6671 12 小时 21 分钟前
|
49
5261 OP @shui14 有的时候我也怀疑自己选择 Rust 当做第二语言的决定是对还是错的!一开始我是学 Go 的,后来看了下 电鸭、或者远程工作大部分都是 web3 相关的岗位,所以才看到 Rust ,就投入到学习中去了!
|
50
StarsunYzL 11 小时 56 分钟前
还好吧,早年刚入行时第一次见到 boost::xpressive 用 C++模板实现的静态正则表达式我 CPU 都被干烧了,一般的正则:
string reg = "<(\\w+)>.*?</\\1>"; 用 xpressive 写成等效的静态正则(编译期正则)是这样的:。。。。 sregex sre = '<' >> (s1= +_w) >> '>' >> -*_ >> "</" >> s1 >> '>'; C++模板竟然还能实现这种功能,我都惊呆了,C++用有限的标准却能实现的各种奇葩语法和功能的上限实在是太高了 |
51
xfn 10 小时 47 分钟前
|
53
leon1 9 小时 31 分钟前
rust 这种如果不降低入门门槛,那这个语言是很难发展起来的
|
54
xgdgsc 8 小时 39 分钟前
https://users.rust-lang.org/about 可以比较这种 user signup/active user 比率判断难度, https://discourse.julialang.org/about https://elixirforum.com/about .可惜 discourse 升级把最近 30 天的升级没了,只有 7 天的了
|
55
yplam 5 小时 56 分钟前 via Android
写一下 Future, 写一下 Stream, 你就会发现这都不是事
|
56
PTLin 5 小时 48 分钟前
你都开始求打醒了,那我也只能说别学了。
一是 rust 本身就业市场就不行。 二是这闭包才哪到哪,借用规则,重借用,nll ,生命周期的变性,unsafe ,async 底层原理,哪个都够你喝一壶。 所以真是为了找工作,不是为了 just for fun 真的建议趁早弃坑。 |
57
DOLLOR 4 小时 53 分钟前
rust 的竞品是 c c++,c c++的使用场景有多复杂,rust 也就有多复杂。
如果你平时都是写 go java js python 做业务开发的,自然会觉得 rust 很复杂。 |
58
winterbells 4 小时 50 分钟前 via Android
@xfn 我用 ai 改写了我的一个工具,里面就很多这种代码。我很想简化,但是搞不明白
原来真的就是这种语法啊… |