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突然进入范围。所以
match请将返回值与匹配Ok(),然后将(在之中Ok)分配给num。但是,为什么num右边的设备突然可用?Ok(num)和有Ok(_)什么区别?如果我们开始与在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)
| 归档时间: |
|
| 查看次数: |
147 次 |
| 最近记录: |