以下代码()
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(使用前将#替换为@)