在Rust中,main函数定义如下:
fn main() {
}
Run Code Online (Sandbox Code Playgroud)
但是,此函数不允许返回值.为什么一种语言不允许返回值,是否有办法返回一些东西?我是否能够安全地使用C exit(int)功能,否则会导致泄漏等等?
我可以使用该#[must_use]属性将函数标记为具有必须使用或显式忽略的返回值:
#[must_use]
fn plain() -> i32 {
1
}
fn main() {
plain(); // warning
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我想更改我的函数,使其现在返回 a Result,我不能这样做:
#[must_use]
fn result() -> Result<i32, ()> {
Ok(1)
}
fn main() {
result().unwrap();
}
Run Code Online (Sandbox Code Playgroud)
因为对的调用.unwrap()算作“使用”,并且该#[must_use]属性应用于整个Result.
有没有办法#[must_use]也适用于内部类型?本质上我想确保i32不会意外地被分号“吃掉”。
我有一个额外的限制,即我无法更改此函数的公共 API,因此我无法让它返回 aResult<MustUse<i32>, ()>或类似的内容。
摘自Rust 书的第 3.5 章:
我们使用
break带有 value的关键字counter * 2。在循环之后,我们使用分号结束为 赋值的语句result。
加上代码片段:
fn main() {
let mut counter = 0;
let result = loop {
counter += 1;
if counter == 10 {
break counter * 2;
}
};
println!("The result is {}", result);
}
Run Code Online (Sandbox Code Playgroud)
我明白这是如何工作的以及为什么结果是 20,但我注意到如果我删除包含break关键字的行上的分号,程序是等效的。
为什么在这种情况下分号是可选的?