使用非文字模式时,为什么此匹配模式无法到达?

以下代码(游乐场)


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

};

_当第一个示例中的任何值都可以达到时,为什么不可达current_column != max_column?


holdtom
浏览 348回答 2
2回答

噜噜哒

Rust编程语言解释了如何match处理表达式,重点是:当match表达式执行时,它会按顺序将结果值与每个手臂的模式进行比较。在您的示例中,max_column是要绑定的变量的名称,而不是常量或外部变量。当编译器到达时max_column,所有剩余的值都将分配给该匹配臂,从而使后续的臂不可用。就您而言,您需要一名比赛后卫: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并且_是同样的事情在这种情况下!在这两种情况下,匹配的变量都将绑定到一个名称(a或_分别绑定),但是任何带前缀的标识符_都是特殊情况,以用作未使用的变量占位符。bluss澄清并纠正了这种近似:_是一个单独的特殊情况,它根本不是变量绑定,但是没有一个!匹配_x将值移入_x,_则不会这样。(差异是可以观察到的。)

UYOU

另一种选择是,x => /* the default case, using x */当x在任何可见范围内引入名称时,匹配臂不再成为默认情况。这是不一致的,对我来说,也是违反直觉的。
打开App,查看更多内容
随时随地看视频慕课网APP