瞎扯淡 关于 Rust 语言里的分号

krrr · 2016年01月03日 · 最后由 krrr 回复于 2016年01月04日 · 5041 次阅读

看了一篇文章:http://lucumr.pocoo.org/2012/10/18/such-a-little-thing/ 里面拿了 Ruby、Py、Rust 对比说明分号的来由: 为了防止 Ruby 里“为避免返回无用的值而在方法末尾加个 nil”的做法而赋予了有无分号特殊的意义。

我的反应是:就算 Ruby 有这样的问题,因为 Rust 是静态类型,只要方法定义里加上表示无返回值得类型就好,而且 Scala 也用了类似 Ruby 的内部迭代器,它就没有分号。 是我没找到重点吗……

补充: 想问的问题:为什么 Rust 里分号的规则这么奇怪 猜测:Rust 最初设计就是想要用 C 风格的大括号和分号。但是现在因为几乎一切都是表达式,于是想省去方法末尾的 return,就赋予了(方法里最后一个表达式)有无分号特殊的意义

Ruby 的分号就是用来分隔语句的,块的最后一条语句的值就是返回值。 Rust 里不加分号就只是一个 expression,加了分号就变成一个 statement,最后的 expression 的值就会成为返回值

#1 楼 @wormful 你说的“最后一条语句”,是指表达式吧(中文的“语句”一般指 statement 吧)?然后就如你说的,事实是这样,但是我不明白的是 Rust 为什么设计成这样,还有人说它优雅

#2 楼 @krrr Ruby 里面一切都是 expression,确实用“表达式”更精准。 至于 Rust 为什么没有像 Ruby 一样完全用 expression 我也不知道,等钻研 PL 的同学来回答吧……

rust 有分号的是语句(声明语句和表达式语句),返回值是(),用来表示没有返回值。而没分号的是表达式,返回值就是自身的值。 至于为什么要这样,我觉得一个是用分号来分隔语句,另一个原因是 rust 里没有 nil 官方的 guide 讲得比较清楚 https://kaisery.gitbooks.io/rust-book-chinese/content/content/5.2.Functions%20%E5%87%BD%E6%95%B0.html

#4 楼 @chaucerling 其实可以这样设计: 对于fn f() -> () {1},如果编译器不像现在一样报错而是直接扔掉返回值,就不需要有无括号的规则了。有人(应该是大多数)会觉得变麻烦了…… 突然想起来 Scala 虽然没分号但也有类似的规则(方法定义里的“=”的有无),也有人总是不省略等号写def f(): Unit = {}的, 我大概只是对这类规则过敏……

需要 登录 后方可回复, 如果你还没有账号请 注册新账号