为什么在比赛中使用以前未声明的名称?

Jef*_*ite 4 pattern-matching rust

我在阅读本书第二章的代码时遇到了一个问题:

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

我的问题是Ok(num) => num:parse()返回一个值(Ok或Err),match将返回的值与第一个手臂进行比较。如果匹配,则表达式将在第一个分支旁边执行语句,对吗?

在Ok(num),num似乎突然弹起,因为当时没有申报num在前面的代码。与声明相同=> num::num突然进入范围。所以

  1. 如果我猜对了,match请将返回值与匹配Ok(),然后将(在之中Ok)分配给num。但是,为什么num右边的设备突然可用?
  2. 如果我猜对了,与Ok(num)和有Ok(_)什么区别?

sn9*_*n99 9

如果我们开始与在Ok和Err来自中,我们可能会得到一个更好的主意。它们是Result枚举的一部分,定义如下:

enum Result<T, E> {
   Ok(T),
   Err(E),
}
Run Code Online (Sandbox Code Playgroud)

T和E是通用类型。match本身就像C的switch声明,但更灵活。

match本身的一般形式是:

match value {
    pattern => expr,
    ...
}
Run Code Online (Sandbox Code Playgroud)

如果匹配,则表达式将在第一个分支旁边执行语句,对吗?

是

但是,为什么num右边的设备突然可用?

因为match匹配每个手臂中左侧的模式=>。它可以解开元组,匹配结构域,借用值的一部分等。

如果我猜对了,与Ok(num)和有Ok(_)什么区别?

_ 是通配符模式,可以匹配所有内容。

Ok(num)和之间的区别Ok(_)是,在第一种情况下,您要询问the Result是Ok变量,然后将其类型值存储T在中num。在第二种情况下,您是说您不在乎值Ok是什么,只要您想执行某事Result的Ok变体即可。

请记住,_在模式中使用时,不能_在代码内部使用,即,由于_不是标识符,因此无法使用:

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