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

标签 rust pattern-matching

我在理解本书第二章的这段代码时遇到了问题:

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

我的问题是 Ok(num) => num:parse() 返回一个值(OkErr ), match 将返回值与第一臂进行比较。如果匹配,表达式将执行第一个 ARM 旁边的语句,对吧?

Ok(num)中,num似乎是突然弹出来的,因为之前的代码中没有声明num。与语句相同,=> num: num 突然出现在范围内。所以

  1. 如果我猜对了,match 将返回值与 Ok() 匹配,然后分配任何数字(在 Ok 内) >) 到 num。但是为什么右边的num突然可以用了呢?
  2. 如果我猜对了,Ok(num)Ok(_) 有什么区别?

最佳答案

如果我们从 OkErr 的来源开始,我们可能会得到更好的主意。它们是 Result 的一部分枚举定义如下:

enum Result<T, E> {
   Ok(T),
   Err(E),
}

TE 是通用类型。 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) and Ok(_)?

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

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/

相关文章:

opencv - 计算机视觉中的形状/模式匹配方法

postgresql - PostgreSQL 查询中具有模式匹配语法的参数

字符串匹配算法设计

rust - 序列化 null 值或默认值时如何避免生成 JSON?

rust - 使用 Tokio 的 mpsc 和 oneshot 会导致死锁

rust - 动态大小类型总是在堆上吗?

rust - PI常数不明确

rust - 不使用 libcore 实现内置类型的基本操作

python - 查找一定范围内有间隙的子列表

Java 扫描仪找不到单词