gpt4 book ai didi

rust - Rust 书的模式部分中的匹配阴影示例非常令人费解

转载 作者:行者123 更新时间:2023-11-29 07:56:21 25 4
gpt4 key购买 nike

在学习Rust的过程中,遇到了以下in the official Rust book :

There’s one pitfall with patterns: like anything that introduces a new binding, they introduce shadowing. For example:

let x = 'x';
let c = 'c';

match c {
x => println!("x: {} c: {}", x, c),
}

println!("x: {}", x)

This prints:

x: c c: c
x: x

In other words, x => matches the pattern and introduces a new binding named x that’s in scope for the match arm. Because we already have a binding named x, this new x shadows it.

我不明白两件事:

  1. 为什么匹配成功?
    cx 的不同值不应该导致失败吗?
  2. 匹配臂 x 绑定(bind)如何设置为 'c'
    这是否以某种方式返回了 println! 表达式?

最佳答案

对于match 的意义存在一个根本性的误解。

顾名思义,模式匹配不是关于值的匹配,而是关于模式的匹配。为了方便和安全,它还允许将名称绑定(bind)到匹配模式的内部:

match some_option {
Some(x) => println!("Some({})", x),
None => println!("None"),
}

为方便起见,match 被扩展为匹配 values 专门针对 literals(整数或 bool 值)进行匹配,我认为这是在你困惑的根源。

为什么?因为匹配必须穷尽!

match 表达式在那里,因此编译器可以保证您处理所有可能性;检查您是否处理了所有模式很容易,因为它们在编译器的控制之下,但在存在自定义相等运算符的情况下检查您是否处理了所有值则很困难。


在匹配子句中只使用名称时,您创建了一个无可辩驳的模式:一个永远不会失败的模式。在这种情况下,匹配的整个值都绑定(bind)到这个名称。

您可以通过在之后添加第二个匹配子句来展示这一点,编译器将警告后一个绑定(bind)不可访问:

fn main() {
let x = 42;
match x {
name => println!("{}", name),
_ => println!("Other"),
};
}

<anon>:6:5: 6:6 error: unreachable pattern [E0001]
<anon>:6 _ => println!("Other"),
^

结合阴影规则,它特别允许通过重用绑定(bind)名称来绑定(bind)另一个值来隐藏范围中的绑定(bind),您得到示例:

  • match 分支中,x 绑定(bind)到 'c' 的值
  • 在 arm 之后,作用域中唯一的 x 是绑定(bind)到值 'x' 的原始值

关于rust - Rust 书的模式部分中的匹配阴影示例非常令人费解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35563141/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com