@blajlhimik

Есть возможность локонично реализовать множественную фильтрацию в if let?

есть функция в которой надо найти позиций значений, если хоть одно не найдено выдавать ошибку:
fn read() -> Result<(), io::Err> {
            let vec: Vec<u8> = !vec[2, 5, 8, 10, 15, 16];
            if let Some(poz_1) = self.responce.iter().position(|&el| el == 8) && 
                 let Some(poz_2) = self.responce.iter().position(|&el| el == 15) &&
                 let Some(poz_3) = self.responce.iter().position(|&el| el == 12) {
                    return Ok(());
            } else {
                return io::Err::new("understading message");
            }       
        }

компилятор не дает через && это делать
`let` expressions in this position are unstable
see issue #53667 <https://github.com/rust-lang/rust/issues/53667> for more informationrustcE0658
[E0658] `let` expressions in this position are unstable.

но писать 3+ if-ов или match выглядить трудночитабельно, как можно еше сделать?
  • Вопрос задан
  • 107 просмотров
Решения вопроса 1
vabka
@vabka
Токсичный шарпист
В твоём случае логичнее было бы использовать метод any, если ты хочешь просто проверить, что такие элементы существуют.

Как вариант ты можешь сделать так, если тебе нужны потом переменные poz_*:
fn read() -> Result<(), io::Err> {
  //let vec: Vec<u8> = !vec[2, 5, 8, 10, 15, 16];
  let pos1 = self.responce.iter().position(|&el| el == 8).ok_or_else(||io::Err::new("understading message"))?;
  let pos2 = self.responce.iter().position(|&el| el == 15).ok_or_else(||io::Err::new("understading message"))?;
  let pos3 = self.responce.iter().position(|&el| el == 12).ok_or_else(||io::Err::new("understading message"))?;
  return Ok(());
}

Ещё можно попробовать let-else
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Mysterio_original
fn read() -> std::io::Result<()> {
    let vec: Vec<u8> = vec![2, 5, 8, 10, 15, 16];
    if let Some((poz_1, (poz_2, poz_3))) = vec.binary_search(&8).ok()
        .zip(vec.binary_search(&15).ok().zip(vec.binary_search(&12).ok())) {
            return Ok(());
    } else {
        return Err(std::io::Error::new(std::io::ErrorKind::Other, "understading message"));
    }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы