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

Is it possible to use a fold with a Vec?

我在考虑如何在 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 超出范围,我不能 return datafold.

有没有办法将折叠与 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 会变成非常大的数字!