为什么编译器假定if let的值应为`()`?

Iak*_*dov 1 rust

我有以下代码:

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)

该代码位于何处或它是否是该函数的最后一个表达式都无关紧要。

为什么编译器假定花括号内的表达式应该是()

Iak*_*dov 5

根据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)

这个答案是受此评论启发的。