为什么使用非文字模式时无法访问此匹配模式?

2024-04-25

以下代码()

let max_column = 7;
edge = match current_column {
    0 => Edge::Left,
    max_column => Edge::Right,
    _ => Edge::NotAnEdge
};

结果出现以下警告:

warning: unreachable pattern
  --> src/main.rs:10:9
   |
9  |         max_column => Edge::Right,
   |         ---------- matches any value
10 |         _ => Edge::NotAnEdge
   |         ^ unreachable pattern
   |
   = note: #[warn(unreachable_patterns)] on by default

替换变量max_column字面效果很好:

let max_column = 7;
edge = match current_column {
    0 => Edge::Left,
    7 => Edge::Right,
    _ => Edge::NotAnEdge
};

Why is _在第一个示例中,当任何值都可以达到时,则无法达到current_column != max_column?


Rust 编程语言 https://doc.rust-lang.org/book/second-edition/ch06-02-match.html解释了如何match表达式已处理,强调我的:

当。。。的时候match表达式执行时,它将结果值与每个臂的模式进行比较,in order.

在你的例子中,max_column是要绑定的变量的名称,not常量或外部变量。当编译器达到max_column,任何剩余的值都将分配给该匹配臂,从而使后续臂无法访问。

就你而言,你想要max_column实常数:

let current_column = 1;
const MAX_COLUMN: i32 = 7;
edge = match current_column {
    0          => Edge::Left,
    MAX_COLUMN => Edge::Right,
    _          => Edge::NotAnEdge
};

或者,如果那不可能,您想要一个比赛后卫:

let current_column = 1;
let max_column = 7;
edge = match current_column {
    0                    => Edge::Left,
    a if a == max_column => Edge::Right,
    _                    => Edge::NotAnEdge
};

请注意,作为第一个近似值,a and _在这种情况下是一样的!在这两种情况下,匹配的变量将绑定到名称(a or _分别),但任何前缀为_是特殊情况,用作未使用的变量占位符。

bluss 澄清并纠正了这种近似 https://stackoverflow.com/questions/28225958/unreachable-pattern-which-should-be-reachable/28226030?noredirect=1#comment44817813_28226030:

_是一种单独的特殊情况,它根本不是变量绑定,而是缺少变量绑定!匹配对_x将值移入_x, _没有这样的事情。 (差异是可以观察到的。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么使用非文字模式时无法访问此匹配模式? 的相关文章

随机推荐