【发布时间】:2015-01-10 13:09:36
【问题描述】:
我正在学习 Rust,但我发现一些函数令人困惑。根据the official reference,返回表达式:
.. [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"
}
}
当我在“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";
}
}
我的understanding of expression statements (e.g. expr;) 是它将评估expr 表达式,并忽略结果(而是使用())。在使用return expr; 的情况下,使用; 似乎没有原因,因为return expr 破坏了当前函数激活帧(然后会忽略;) .
那么,为什么我见过的很多 Rust 代码在没有必要的情况下使用分号(实际上让 learning about Rust's functions 非常混乱......因为感觉它是矛盾的)。它只是继承了其他语言的成语吗?
【问题讨论】:
-
那些
;在 C/C++/Java/Perl 中是必需的,可能还有更多。 -
@Mat - 当然!但是,在 Rust 中,您可以使用最后一行返回一个值没有显式
return... 并且您不使用分号,因为它会评估表达式并返回().查看official book 了解我的意思。它似乎不一致...... -
@delnan - 是的。当得知
;导致函数返回()时,这会让人感到困惑...除非您使用过return expr;。 -
@delnan official book 不同意你的看法:“我们的函数声称返回 i32,但使用分号,它会返回 ()。”此外,省略分号的情况也很多(例如the official time crate)。
-
@TheCloudlessSky 分号将
x + 1转换为语句,语句计算为()。所以从这个意义上说,分号将返回值转换为(),但恕我直言,这不是考虑它的最佳方式,当然不是对于所有地方的分号。至于timecrate:AFAIK 更常见的convention,虽然没有得到 RFC 的正式祝福,但在returns 上是分号。
标签: rust