我在理解本书第二章的这段代码时遇到了问题:
let guess: u32 = match guess.trim().parse() {
Ok(num) => num,
Err(_) => continue,
};
我的问题是 Ok(num) => num
:parse()
返回一个值(Ok
或 Err
), match
将返回值与第一臂进行比较。如果匹配,表达式将执行第一个 ARM 旁边的语句,对吧?
在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),
}
T
和 E
是通用类型。 match
本身类似于 C 的 switch
语句,但更灵活。
match
本身的一般形式是:
match value {
pattern => expr,
...
}
If those match, the expression will execute the statement beside the first arm, right?
是
But why is
num
at the right suddenly usable?
因为 match
匹配每个臂中 =>
左侧的模式。它可以解包元组、匹配结构字段、借用部分值等。
If I guessed right, what's the difference of
Ok(num)
andOk(_)
?
_
是通配符模式,匹配所有内容。
Ok(num)
和 Ok(_)
之间的区别在于,在第一种情况下,您询问的是 Result
是否是Ok
变体然后将其 T
类型的值存储在 num
中。在第二种情况下,你是说你不关心 Ok
持有什么值——只要 Result
是你想要的 Ok
变体执行某事。
请记住,当您在模式中使用 _
时,您不能在代码中使用 _
即这将不起作用,因为 _
不是标识符:
let guess: u32 = match guess.trim().parse() {
Ok(_) => _,
Err(_) => continue,
};
关于rust - 为什么可以在比赛中使用以前未声明的名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55408608/