以下代码(游乐场)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,_则不会这样。(差异是可以观察到的。)
UYOU
TA贡献1878条经验 获得超4个赞
另一种选择是,x => /* the default case, using x */
当x
在任何可见范围内引入名称时,匹配臂不再成为默认情况。这是不一致的,对我来说,也是违反直觉的。
- 2 回答
- 0 关注
- 347 浏览
添加回答
举报
0/150
提交
取消