关于Rust中return逻辑及loop语句break返回值的疑问
Rust中loop、break与分号的常见疑问解答
先看示例代码:
fn main() { let mut counter = 0; let result = loop { counter += 1; if counter == 10 { break counter * 2; } }; println!("Zmienna result wynosi {result}"); }
针对三个疑问逐一解答:
1. 为何带有分号的break counter * 2;语句能返回值?
Rust里的break是特殊控制流语法,它支持在后面跟随表达式,用来作为所在loop的返回值。这里的分号只是把整个break结构标记为一条完整语句,但并不会丢弃break后面表达式的值——break的返回逻辑和普通表达式的分号规则无关,只要break后面跟着表达式,不管有没有分号,这个表达式的值都会传递给loop作为返回值。
2. 去掉该行的分号后运行结果一致,原因是什么?
去掉分号后,break counter * 2本身是一个带返回值的控制流表达式,它作为if代码块的最后一项,if块的求值结果就是这个break的返回值,最终还是会被loop捕获作为自身的返回值。本质上,break带表达式的写法,不管是作为语句(加分号)还是作为表达式(不加分号),只要表达式counter * 2被正确求值,就会传递给loop,所以运行结果完全一致。
3. 给loop的闭合大括号添加分号写成};后结果仍一致,这是为什么?
首先,loop本身是一个能返回值的表达式。你给闭合大括号后加的分号,其实是在loop表达式后面多了一个分号,形成了一个空语句,但赋值操作let result = loop { ... }已经完成——result捕获的是loop表达式的返回值,后面额外的分号只是一个无意义的空语句,不会影响之前的赋值结果。就像写let x = 5;;一样,第二个分号不会改变x的值,只是语法上允许的空语句而已。
内容的提问来源于stack exchange,提问作者Mateusz Szymczak
相关产品推荐
相关产品推荐

