为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Git
holdtom 2019-10-12 13:53:48
以下代码(游乐场)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 value10 |         _ => Edge::NotAnEdge   |         ^ unreachable pattern   |   = note: #[warn(unreachable_patterns)] on by defaultmax_column用文字替换变量可以正常工作:let max_column = 7;edge = match current_column {    0 => Edge::Left,    7 => Edge::Right,    _ => Edge::NotAnEdge};_当第一个示例中的任何值都可以达到时,为什么不可达current_column != max_column?
查看完整描述

2 回答

?
噜噜哒

TA贡献1784条经验 获得超7个赞

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,_则不会这样。(差异是可以观察到的。)


查看完整回答
反对 回复 2019-10-12
?
UYOU

TA贡献1878条经验 获得超4个赞

另一种选择是,x => /* the default case, using x */x在任何可见范围内引入名称时,匹配臂不再成为默认情况。这是不一致的,对我来说,也是违反直觉的。

查看完整回答
反对 回复 2019-10-12
  • 2 回答
  • 0 关注
  • 341 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信