我正在学习Rust,我发现了一些令人困惑的功能。根据{{3}},返回表达式:
.. [is]用关键字return表示。评估返回表达式会移动它 参数进入当前函数的输出槽,破坏当前函数的激活 帧,并将控制转移到呼叫者框架。
所以,这个程序有效:
fn main() {
let current_hour = 10;
let message = get_message(current_hour);
println!("Good {0}", message);
}
fn get_message(current_hour: i32) -> &'static str {
if current_hour < 11 {
return "Morning"
}
else if current_hour < 17 {
return "Afternoon"
}
else {
return "Evening"
}
}
当我在“返回”表达式中添加分号时,它仍然有效:
fn main() {
let current_hour = 10;
let message = get_message(current_hour);
println!("Good {0}", message);
}
fn get_message(current_hour: i32) -> &'static str {
if current_hour < 11 {
return "Morning";
}
else if current_hour < 17 {
return "Afternoon";
}
else {
return "Evening";
}
}
我的the official reference是评估expr
表达式,忽略结果(而不是()
)。在使用return expr;
的情况下,使用;
似乎没有原因,因为return expr
会破坏当前的功能激活框架(然后会忽略;
)。
那么,为什么我见过的很多Rust代码都使用了分号(如果没有必要的话)(实际上让understanding of expression statements (e.g. expr;
)非常混乱......因为它感觉它是矛盾的)。这只是其他语言的成语吗?
答案 0 :(得分:4)
这只是其他语言的成语吗?
是的,我认为就是这样,只是习惯,可能是一种普遍的美学感,关于什么感觉很奇怪,什么不感觉(当然受某人之前语言的影响)。
AFAICT,它唯一的区别就是像
这样的东西fn foo() {
return;
println!("hi");
}
其中return
需要是一个语句......但是return
之后的代码是无法访问的(编译器会告诉你),所以这在实际代码中可能不会发生这么多