Можно ли использовать охранники сопоставления с образцом в `while let`?
У меня есть while let
цикл, который проходит через итератор Result
и использует сопоставление с образцом; он проходит через итератор, пока не достигнет Err
или Ok
значение пустая строка:
while let Some(Ok(a)) = some_iterator.next() {
if a == "" {
break;
}
// ...
}
Этот код работает нормально. Тем не менее, я думаю, что if
Заявление выглядит некрасиво и, вероятно, не является идиоматическим Rust. В match
операторы, охранники могут использоваться при сопоставлении с образцом, например так:
match foo {
Some(Ok(a)) if a != "" => bar(a)
// ...
}
Это было бы идеально для моего while let
цикл, хотя используемое сопоставление с образцом, кажется, не поддерживает его, вызывая синтаксическую ошибку:
while let Some(Ok(a)) = some_iterator.next() if a != "" { // <-- Syntax error
// ...
}
Есть ли способ использовать охрану, как это в состоянии while let
? Если нет, есть ли лучший способ выхода из цикла, если найдена пустая строка?
2 ответа
Нет, while let
а также if let
шаблоны не могут иметь охранников. Были некоторые обсуждения об изменении этого (например, здесь), но пока ничего не решено.
Что касается альтернатив, я думаю, что ваша версия довольно ясна, и я не могу придумать какие-либо способы действительно улучшить это.
Для тех, кто найдет это через поиск в Интернете, вотif-let-chains
RFC, в котором рассматриваются условия вif let
выражения: