Вы можете использовать шаблоны в качестве привязки в цикле 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
для &HashMap
), являются кортежами.Вы также можете написать выше как
for tuple in &numbers {
let (name, number) = tuple;
println!("{}: {}", name, number);
}
, потому что let
- это другое место, где разрешены только неопровержимые образцы.