我有以下代码:
use std::collections::HashSet;
fn translate() -> Option<String> {
None
}
fn main() {
let mut found = HashSet::new();
if let Some(tr) = translate() {
found.insert(tr);
}
}
Run Code Online (Sandbox Code Playgroud)
它正常工作,但是当我在之后删除分号时found.insert(tr),出现编译器错误:
use std::collections::HashSet;
fn translate() -> Option<String> {
None
}
fn main() {
let mut found = HashSet::new();
if let Some(tr) = translate() {
found.insert(tr);
}
}
Run Code Online (Sandbox Code Playgroud)
该代码位于何处或它是否是该函数的最后一个表达式都无关紧要。
为什么编译器假定花括号内的表达式应该是()?
根据Rust Book(重点是我的):
表达式的值是所选分支中最后一个表达式的值。一个
if没有else结果总是在()作为值。
这限制了花括号内的表达式值。
这是正确的,因为表达式类型匹配():
if let Some(_) = some() {
()
};
Run Code Online (Sandbox Code Playgroud)
这是正确的,因为有一条else语句(分支之间的类型匹配):
if let Some(_) = some() {
true
} else {
false
};
Run Code Online (Sandbox Code Playgroud)
但这是错误的:
if let Some(_) = some() {
true
};
Run Code Online (Sandbox Code Playgroud)
这个答案是受此评论启发的。