match 如何在其怀抱中使用 `continue` 进行编译?

sta*_*an0 6 rust

我正在阅读《Rust 编程语言》一书,我偶然发现了一个简单的表达式:

let guess: u32 = match guess.trim().parse() {
    Ok(num) => num,
    Err(_) => continue,
};
Run Code Online (Sandbox Code Playgroud)

它的手臂如何match处理不同的表情?例如,第一个臂将简单地“返回”,num以便将其分配给,guess但在第二个臂中,表达式只是continue。如何match处理它并且不“分配”continue而是guess执行它?整个赋值表达式本身会发生什么?它是否从调用堆栈中删除(如果这是正确的术语)?

Cha*_*man 11

continue有一个特殊类型:它返回never 类型,表示为!

这种类型的意思是“后面的代码是无法访问的”。由于跳转到循环的下一个周期,它实际上永远不会返回任何值(对于和continue也是如此,它也是 的返回类型,包括所有发生恐慌的宏:、等)。returnbreakpanic!()unreachable!()todo!()

never 类型很特殊,因为它强制(自动转换)为任何类型(因为如果某件事不能发生,我们可以毫无问题地将其视为u32String或其他 - 它不会发生)。这意味着它也与任何其他类型统一!,意味着任何类型与其他类型的交集。

match要求表达式的类型统一(就像 一样if)。!所以你的代码返回and u32==的统一u32

您可以看到,如果您表示类型(需要每晚,因为使用!不在返回类型位置的类型是实验性的):

let num = match num {
    Ok(num) => {
        let num: i32 = num;
        num
    }
    Err(()) => {
        let never: ! = continue;
        never
    }
};
Run Code Online (Sandbox Code Playgroud)

游乐场