我简化了一个例子,出现在学习生 rust 的例子-警卫:https://doc.rust-lang.org/rust-by-example/flow_control/match/guard.html
let number: u8 = 4;
match number {
i if i == 0 => println!("Zero"),
}
}
上面的例子导致了一个编译错误,因为匹配的情况不全面。我不知道为什么。文章说“注意,当检查匹配表达式是否覆盖了所有模式时,编译器不会考虑保护条件。”但是下面的例子并没有导致编译错误:
match number {
i => println!("Zero"),
}
不同的是我去掉了防护,如果防护不应该被考虑进去,为什么会影响到事情呢?
1条答案
按热度按时间pn9klfpd1#
你引用的文档并没有说没有考虑保护,而是说没有考虑保护 * 条件 *。这意味着即使
number
的所有可能值都被覆盖了,下面的代码也将无法编译:或者甚至是这样的:
换句话说,在匹配臂上存在防护装置的事实将导致在检查匹配是否完成时完全忽略该臂。