Можно ли использовать охранники сопоставления с образцом в `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-chainsRFC, в котором рассматриваются условия вif letвыражения:

https://rust-lang.github.io/rfcs/2497-if-let-chains.html

Другие вопросы по тегам