Rust 中 println! 是 expression 还是 statement ?

2016-12-28 10:29:17 +08:00
 rustacean
在看 *The Rust Programming Language* 的时候 Functions 这一节讲到 expression 和 statement 的区别。想弄明白 *println!* 是 expression 还是 statement . 找到这两篇答案:

- 是 [statement]( https://users.rust-lang.org/t/expression-statements/7733)
>since it has a semicolon, it's a statement. And if you have a block like { statement; statement; expression } then that final expression becomes the value for the whole block.

- 是 [expression]( http://stackoverflow.com/a/28439789/4974466)
>'println!()' is a macro expanding to an expression. It has no useful return value, but it is an expression (mostly because almost everything is an expression, including function calls and blocks).
能有前辈解释一下正确的理解是什么嘛?
4159 次点击
所在节点    Rust
6 条回复
realwangyibo
2016-12-28 12:26:13 +08:00
println!("Naive")是表达式,宏展开是表达式,表达式的值是 ()

表达式语句是在表达式后跟分号,将表达式变成语句, println!("Naive");是语句
realwangyibo
2016-12-28 12:42:37 +08:00
鄙人认为,表达式是无法被执行的,只有语句可以。

do_something_with_vector(&mut vector) 是函数调用表达式,只是相当于把干柴堆好。

do_something_with_vector(&mut vector); 是函数调用(表达式)语句,在堆好干柴的情况下点一把火。

; 也是语句,只不过没有柴,点多少次火都没什么用。
rustacean
2016-12-28 12:46:10 +08:00
@realwangyibo 谢谢您
peng1999
2016-12-29 19:19:46 +08:00
@realwangyibo 我倒觉得表达式的求值过程才是算程序的执行,分号只是在多个表达式顺序求值是使用。例如,最后一个语句是可以不写分号的。
realwangyibo
2016-12-29 20:28:40 +08:00
@peng1999 block 是表达式, block 的值取决于最后的表达式的值。如果最后的是语句,则 block 的值是(),所以最后不写分号的,是表达式而不是语句。

求值的方式是表达式规定的,但「求值」这个动作是表达式语句执行的。
sidgwick
2018-09-04 20:14:34 +08:00
@realwangyibo 求值也是表达求值吧, 语句是没有值的. 还有 Rust 里面是不是没有表达式语句这种说法?

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

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

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

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

© 2021 V2EX