Loops “为什么?”;“中断”;结束“时不需要分号”;循环“;?
摘自《铁锈书》的一部分: 我们使用值为Loops “为什么?”;“中断”;结束“时不需要分号”;循环“;?,loops,rust,syntax,break,keyword,Loops,Rust,Syntax,Break,Keyword,摘自《铁锈书》的一部分: 我们使用值为计数器*2的break关键字。循环结束后,我们使用分号结束将值赋给result的语句 加上代码片段: fn main(){ 设mut计数器=0; 让结果=循环{ 计数器+=1; 如果计数器==10{ 中断计数器*2; } }; println!(“结果是{}”,result); } 我理解这是如何工作的,以及为什么结果是20,但我注意到,如果我删除包含break关键字的行上的分号,则程序是等效的 为什么分号在这种情况下是可选的?一个较短的示例: let _
计数器*2
的break
关键字。循环结束后,我们使用分号结束将值赋给result
的语句
加上代码片段:
fn main(){
设mut计数器=0;
让结果=循环{
计数器+=1;
如果计数器==10{
中断计数器*2;
}
};
println!(“结果是{}”,result);
}
我理解这是如何工作的,以及为什么结果是20,但我注意到,如果我删除包含break
关键字的行上的分号,则程序是等效的
为什么分号在这种情况下是可选的?一个较短的示例:
let _: i32 = loop {
if true {
break 3; // ()
}
};
这只是分号不影响预期结果的另一个例子。例如,插入分号会引入表达式语句,其计算结果为单位类型()
。由于循环
s和如果
表达式继续允许对同一类型进行计算的代码块()
,则所有类型都是一致的
let _: i32 = loop {
if true {
break 3 // !
}
};
如果分号被去掉,则break
将被计算为,这将强制为任何其他类型。这意味着它将实现外部范围所期望的任何类型。因此,只要您不尝试在if块结束之前附加任何其他语句,一切都是一样的
中断
和返回
计算为代码>,因为它们的副作用意味着程序将不会按照自然工作流进行
另见:
表达式语句是对表达式求值并忽略其结果的语句。通常,表达式语句的目的是触发对其表达式求值的效果
仅由块表达式或控制流表达式组成的表达式,如果在允许语句的上下文中使用,可以省略后面的分号
我想这纯粹是为了美学和人体工程学,因为几乎所有的东西都是铁锈的表现。如果后面的分号在所有表达式之后都是必需的,那么我们必须用分号终止If-else块(也是表达式):
if{
//做点什么
}否则{
//做点别的
}; // 可能是因为中断计数器*2
是if
块中的最终表达式。这可能有帮助:。我不确定break
的行为到底如何,但这通常是其他表达式的情况,而且似乎是相同的情况。我认为,break
表达式从未键入()。因此,永远不要将类型强制为任何其他类型,当if块的最后一个表达式是break
时,它强制为独立表达式的类型()
。解释得很好。不过,让我把这一点弄清楚——如果我们要从“return 5”中删除“return”,分号将成为必填项,对吗?“否则程序就不会编译了。”实际上,保罗·拉兹万伯格(PaulRazvanBerg)相反。如果没有关键字return
,5将隐式返回,分号将抑制该返回,而是返回()
,这将与函数签名不兼容。该死,这就是我的意思。分号必须删除。谢谢你的更正@IvanC。
fn five() -> i32 {
return 5 // to semicolon or not to semicolon? it doesn't matter
}