rust - rust 中返回的值如何?
问题描述
我正在尝试学习 rust,到目前为止,我对返回值的理解是,只要后面没有分号,就会返回块内最后一条语句的值。
在下面的代码中x + 1
(后面没有分号)被返回并分配给y
.
fn main() {
let x = 5;
let y = {
let x = 3;
x + 1
};
println!("The value of y is: {}", y);
}
输出:
The value of y is: 4
但是在下面的代码中,counter * 2
虽然它后面有一个分号,但它是如何返回的。
fn main() {
let mut counter = 0;
let result = loop {
counter += 1;
if counter == 10 {
break counter * 2;
}
};
println!("The result is {}", result);
}
输出:
The result is 20
解决方案
只要后面没有分号,就会返回块内最后一条语句的值。
从技术上讲,除非被覆盖,否则将返回块的最后一个值。在语法上需要它的特定上下文之外,;
真正抑制“当前块”的值并替换()
它,正如您通过尝试编译它所看到的那样:
fn main() {
let a: u8 = { 0; };
}
错误将是E0308 Mismatched Types:由于a
是显式输入的,因此 rustc 期望块的值是 anu8
并抱怨它得到了 a ()
。
但是在下面的代码中 counter * 2 是如何返回的,尽管它后面有一个分号。
这是因为有两种方法可以覆盖特定上下文中的返回值,至少目前是这样:
return <expr>
将立即退出当前函数,结果<expr>
为返回值break <expr>
将立即从当前loop
(或与指定标签匹配的任何一个)退出,结果<expr>
为“循环值”,它仅适用于loop
(notwhile
orfor
) 因为循环必须至少执行一次才能工作
推荐阅读
- python - 如何在 python-docx 中同时应用粗体和居中?
- sql - 使用不包含的 Active Record Join 获取嵌套对象
- android - android - 如何使用 LiveData 和 RxJava 处理错误?
- reactjs - 404 未找到:protobufjs@^5.0.0
- android - 如何在 android 上更改系统视图图标/样式、功能?
- c# - 当元素不存在时,使用 Selenium (C#) 的 IF ELSE 条件
- apache - 如何使用 Apache 在我的 URL 中隐藏 IP 和端口?
- java - 二进制代码上的约束计数集
- android - 无法解析符号“ActivityTestRule”
- python - 旧版本的 python 3.4 不允许 python 3.6.5 工作