iterator - 是否可以将折叠与 Vec 一起使用?

标签 iterator rust fold

我在考虑如何在 Rust 中实现 Fibonacci,并认为我可以用 fold 来实现。

我想出的是:

// Editor's note: this code sample predates Rust 1.0 and 
// is not valid syntax. The concepts remain valid.

range(2, generations).fold(vec![1u, 1], |data: &mut Vec<uint>, value| {
    data.push(data[-2] + data[-1]);

    data
}).last()

但是,这不会编译,因为我无法以借用检查器喜欢的方式将 data 放入 fold 中。它要么是不可变的,要么被多次借用,要么最后一个 data 超出范围,我无法将 data 返回到 fold .

有没有办法将 fold 与 Vec 一起使用?还是我必须求助于循环?

最佳答案

这是 a working version :

fn main() {
    let z = (2..12).fold(vec![1u64, 1], |mut data, _| {
        data.push(data[data.len() - 2] + data[data.len() - 1]);
        data
    });
    println!("{:?}", z.last())
}

您的方法存在一些问题:

  1. data: &mut Vec<uint> (或现代 Rust 中的 usize)— 您的累加器变量不是“对可变向量的引用”,它只是一个“可变向量”。
  2. data[-2] — Rust 不会隐式地从数组的后面开始索引负值。事实上,索引甚至不接受负值!它想要一个 usize , 所以你的 -2-1会变成非常大的数字!

关于iterator - 是否可以将折叠与 Vec 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27760022/

相关文章:

rust - "expected type ` ( )`"在匹配表达式中意味着什么?

rust - 有什么方法可以为 rust 结构附加一些调试字段吗?

recursion - 两种不同类型的 OCaml 递归函数

scala - Flink : How to convert the deprecated fold to aggregrate?

haskell - 如何使用foldr/foldl定义foldM(如果可能的话)?

java - 使用 for 语句和 while 语句向前移动迭代器之间的区别

c++ - 迭代继承类 C++ 的列表

rust - 使用 actix-web 从 HTML 页面捕获 GET 和 POST 请求

c++ - 在数组上使用迭代器

c++ - 使用迭代器访问成员字符串时出错::空