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
}