【问题标题】:Why rust collect method works different on two almost identical functions为什么 rust collect 方法在两个几乎相同的功能上的工作方式不同
【发布时间】:2022-11-03 16:57:48
【问题描述】:

我正在做 rustlings 来学习 rust,我刚刚完成了 iterators3,但我不明白为什么函数:

// Output: Ok([1, 11, 1426, 3])
fn result_with_list() -> Result<Vec<i32>, DivisionError> {
    let numbers = vec![27, 297, 38502, 81];
    let division_results = numbers.into_iter().map(|n| divide(n, 27));
    let x: Result<Vec<i32>, DivisionError> = division_results.collect();
    println!("{x:?}");
    x
}

// Output: [Ok(1), Ok(11), Ok(1426), Ok(3)]
fn list_of_results() -> Vec<Result<i32, DivisionError>> {
    let numbers = vec![27, 297, 38502, 81];
    let division_results = numbers.into_iter().map(|n| divide(n, 27));
    let x:Vec<Result<i32, DivisionError>> = division_results.collect();
    println!("{x:?}");
    x
}

我不明白为什么它们返回其他值,尽管它们非常相似

(PS 这就是功能划分的样子:pub fn divide(a: i32, b: i32) -&gt; Result&lt;i32, DivisionError&gt;

rustling iterators3 exercise

【问题讨论】:

  • 他们不返回“其他值”。他们按照要求将它们作为不同的数据结构返回。
  • 顺便说一句,“几乎相同”的意思是“不同”,那么您为什么会感到惊讶呢?

标签: rust


【解决方案1】:

我不明白为什么它们返回其他值,尽管它们几乎相同

因为不同的部分非常相关:一个使用the implementation of FromIterator for Result

获取 Iterator 中的每个元素:如果是 Err,则不再获取其他元素,并返回 Err。如果没有 Err 发生,则返回一个包含每个 Result 值的容器。

而另一个使用the implementation of FromIterator for Vec,它只是从迭代器创建一个向量。

所以第一个版本累积成功的结果,如果有则返回第一个失败的结果,而第二个版本只是收集所有的结果,无论成功或失败。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-18
    • 2011-12-21
    • 1970-01-01
    • 2019-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多