Преобразование итератора результата в результат & lt; Vec & gt; & gt; [Дубликат]

Извините за позднюю публикацию, но все же для информации, я также столкнулся с такой же проблемой, поэтому я использовал обновленную версию хромированного ревербера ie.2.28 для обновленного браузера Chrome. 55 до 57, которые решили мою проблему.

33
задан Shepmaster 13 June 2016 в 13:53
поделиться

1 ответ

Этот ответ относится к версии Rust до версии 1.0, и необходимые функции были удалены

Вы можете использовать функцию std::result::fold для этого , Он останавливает повторение после встречи с первым Err.

Пример программы, которую я только что написал:

fn main() {
  println!("{}", go([1, 2, 3]));
  println!("{}", go([1, -2, 3]));
}

fn go(v: &[int]) -> Result<Vec<int>, String> {
    std::result::fold(
        v.iter().map(|&n| is_positive(n)),
        vec![],
        |mut v, e| {
            v.push(e);
            v
        })
}

fn is_positive(n: int) -> Result<int, String> {
    if n > 0 {
        Ok(n)
    } else {
        Err(format!("{} is not positive!", n))
    }
}

Выход:

Ok([1, 2, 3])
Err(-2 is not positive!)

Демонстрационный

1
ответ дан Shepmaster 19 August 2018 в 17:19
поделиться
  • 1
    +1 Это потрясающе! (Пример моего ответа перенесен на это: is.gd/E26iv9 ) – Dogbert 15 October 2014 в 11:21
  • 2
    Если мой собственный тип реализует FromIterator, могу ли я применить этот трюк? Ограничено ли это FromIterator или оно может применяться более широко? Как Rust знает, как использовать FromIterator? – Kai Sellgren 15 October 2014 в 17:51
  • 3
    @KaiSellgren Да, вы можете применить этот же трюк. Ключ находится в сигнатуре типа collect , которая является полиморфной по типу возврата, которая должна реализовывать FromIterator. Я не знаю, что вы подразумеваете под ", может ли он применяться более широко. Руста поддерживает полиморфные типы возврата ... Итак, да? (Дополнительные примеры полиморфизма возвращаемого типа см. В Rng и Default свойствах.) – BurntSushi5 16 October 2014 в 11:41
  • 4
    Это имеет смысл, но как узнать, как вызвать метод from_iter()? doc.rust-lang.org/std/iter/trait.FromIterator.html – Kai Sellgren 16 October 2014 в 17:42
  • 5
    @KaiSellgren from_iter вызывается в методе collect . – BurntSushi5 16 October 2014 в 21:39
Другие вопросы по тегам:

Похожие вопросы: