最近初学 rust 有个疑问

2023-12-07 10:03:50 +08:00
 monkeyWie

rust 有空安全机制为什么不搞一套和 kotlin 和 dart 那样的空安全语法糖来替代手写 Option ,感觉写起来挺啰嗦的。

对比下:

// 声明可空
var number: Int? = null
// 取值,为空时给默认值
number ?: 0
// 声明可空
int? number = null;
// 取值,为空时给默认值
number ?? 0
// 声明可空
let number:Option<i32> = None;
// 取值,为空时给默认值
number.unwrap_or(0);

可以看到 kotlin 和 dart 有语法糖写起来舒服多了,rust 为啥不支持下,写成这样:

let number:i32? = None;
number ?? 0

当然还有更方便的链式调用,order?.user?.name 这种

4375 次点击
所在节点    Rust
36 条回复
Leviathann
2023-12-07 10:29:32 +08:00
因为 rust 是 MozillaML
xtreme1
2023-12-07 10:29:46 +08:00
rust 的 ? 运算符已经用于错误处理了, 像这样改会破坏现有的语义
https://blog.rust-lang.org/2016/11/10/Rust-1.13.html#the--operator
serco
2023-12-07 10:31:05 +08:00
因为 Option 本来就是为了解决 nil/null 问题的

你返回也是 Option 就可以链式调用,或者用 try_block
hangbale
2023-12-07 10:45:34 +08:00
我反倒觉得显式定义 Option 类型更加直观,类似的 Haskell 中也有 Maybe 类型
gitrebase
2023-12-07 11:02:15 +08:00
首先支持 #2

再说个可能的视角,Option 算是 FP 原生的 Monad 的概念吧,今天要是对 Option 这个 Monad 特殊处理了,那明天是不是要对 Result 也来个语法糖,后天再来个 Monad 是不是要再搞个语法糖,永无止尽
cyrivlclth
2023-12-07 11:08:32 +08:00
你可以自己加
monkeyWie
2023-12-07 11:10:14 +08:00
@xtreme1 我懂你意思,但是语法糖可以换个符号嘛
PTLin
2023-12-07 11:38:30 +08:00
Option ,Result 实现了 Try trait ,增加了新手很多的理解成本。让这个类型更“特殊”,对于编译器的语法分析,还是代码的阅读都毫无帮助。
kotlin ,dart 这么做很大程度上因为 null 是语言概念的一部分,而 Option 只是一个普通的类型,并无特殊的地方。
imzcg2
2023-12-07 13:44:10 +08:00
?这个问题有人认为简洁有人为奇怪什么东东。直接 option 包裹是最直白的
imzcg2
2023-12-07 13:44:38 +08:00
你以为的优势别人吐槽的也不少
Mistwave
2023-12-07 15:10:35 +08:00
因为 Option 远不只是?. ?:语法糖
举个例子,我可以为 Option 实现 Foldable ,可以 traverse 、sequence
hronro
2023-12-07 17:36:32 +08:00
@gitrebase Result 这个 Monad 已经被特殊处理了吧
kkrainbow9966
2023-12-07 18:37:06 +08:00
```
fn main() {
let a = None;
println!("{}", a.unwrap_or(0));
}
```

这样也可以吧,可以自动推导出类型
yueqianzhang
2023-12-07 18:54:46 +08:00
因为 rust 有一个目标是直观无歧义, 方法重载都没有
yueqianzhang
2023-12-07 18:55:35 +08:00
说错了 默认值..
yueqianzhang
2023-12-07 19:20:11 +08:00
一个带多个问号的链式调用可能中间就中断了(虽然可以不这么写,但毕竟太灵活了没限制)
rust 相当于提醒你要处理调用链的异常情况,起码搜索的时候搜 unwrap 好搜,你搜问号试试...

还有可空类型本来是一个整体却要用两个分开的东西来表示感觉也怪怪的 (doge

https://fengliang.io/RustWHY/design_choices/why_not_overloading.html
yueqianzhang
2023-12-07 19:39:50 +08:00
问号不像一个严肃的系统编程语言用的,感觉风格不搭,Swift/Kotlin 这种风格用倒是挺符合
mainjzb
2023-12-07 20:11:04 +08:00
纯属抄 C++抄过头了。。。
gzlock
2023-12-07 20:19:13 +08:00
先别管什么直不直白了
经常要输入的内容搞得太长了,我是嫌烦的
mainjzb
2023-12-07 20:32:36 +08:00
https://ziglang.org/documentation/master/#Optionals
动态语言可能没有说服力,让我们看一下号称代替 C 的 zig ,同样支持符号化 option 。🙌

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/998266

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX