我不希望以下代码起作用,但是作为语法探索的一部分,我在操场上尝试了:
fn main() {
struct EOF {};
let lines = vec![Ok("line 1"), Ok("line 2"), Err(EOF {})];
for Ok(line) in lines {
println!("{}", line);
}
}
错误消息是
error[E0005]: refutable pattern in `for` loop binding: `Err(_)` not covered
--> src/main.rs:4:9
|
4 | for Ok(line) in lines {
| ^^^^^^^^ pattern `Err(_)` not covered
根据上面的消息,看来我只需要为Err
案件添加一个火柴臂。但是,这样做的正确语法是什么?
您可以将模式用作for
循环中的绑定,但不能使用可重复使用的模式。这里描述了可重用和不可重用模式之间的区别,但是要点是,如果模式可能失败,则不能在let
语句或for
循环中使用它。如果某个模式不能失败,那么您(当前)不能在if let
或中使用它while let
。(此后一个版本可能会在将来的版本中更改为发出警告而不是失败。)
在for
循环中使用不可辩驳的模式的示例可能是这样的:
let mut numbers = HashMap::new();
numbers.insert("one", 1);
numbers.insert("two", 2);
numbers.insert("three", 3);
for (name, number) in &numbers {
println!("{}: {}", name, number);
}
(name, number)
是一个不可辩驳的模式,因为在任何类型的地方检查,它都会匹配。之所以在这里进行类型检查,是因为要迭代的项(由IntoIterator
for的实现定义&HashMap
)是元组。您也可以将以上内容写为
for tuple in &numbers {
let (name, number) = tuple;
println!("{}: {}", name, number);
}
因为let
是另一个只允许使用不可辩驳的模式的地方。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句