是否可以使用Vec折叠?

And*_*old 3 iterator fold rust

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

我想出的是以下内容:

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

    data
}).last()
Run Code Online (Sandbox Code Playgroud)

但是,这不能编译,因为我无法data以借阅检查者喜欢的方式将Vec放入折叠中.要么它是不可变的,要么是多次借用.还是那么最后data是超出了范围,我不能返回datafold.

有没有办法使用Vec折叠?或者我不得不求助于循环?

She*_*ter 7

这是适用于的工作版本

Rust 2015:

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

Rust 2018:

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())
}
Run Code Online (Sandbox Code Playgroud)

您的方法存在一些问题:

  1. data: &mut Vec<uint> 你的累加器变量不是"对可变向量的引用",它只是一个"可变向量".
  2. data[-2]对于负值,Rust不会从数组的后面隐式索引.事实上,该指数甚至不接受负值!它想要一个uint,所以你的,-2-1成为非常大的数字!

  3. data.push(data[-2] + data[-1])这对Rust的版本来说是一种烦恼,它早于非词汇生命期.编译器看到你正在借用向量(通过获取值),并且你将改变向量.然而,看到读取部分将在写入部分之前完成并不是很聪明,因此您必须拆分临时变量.