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
是超出了范围,我不能返回data
来fold
.
有没有办法使用Vec折叠?或者我不得不求助于循环?
这是适用于的工作版本
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)
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)
您的方法存在一些问题:
data: &mut Vec<uint>
你的累加器变量不是"对可变向量的引用",它只是一个"可变向量".data[-2]
对于负值,Rust不会从数组的后面隐式索引.事实上,该指数甚至不接受负值!它想要一个uint
,所以你的,-2
并-1
成为非常大的数字!
data.push(data[-2] + data[-1])
这对Rust的版本来说是一种烦恼,它早于非词汇生命期.编译器看到你正在借用向量(通过获取值),并且你将改变向量.然而,看到读取部分将在写入部分之前完成并不是很聪明,因此您必须拆分临时变量.
归档时间: |
|
查看次数: |
1120 次 |
最近记录: |