是否可以将折叠与 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 data
到 fold
.
有没有办法将折叠与 Vec
一起使用?还是我必须求助于循环?
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())
}
您的方法存在一些问题:
data: &mut Vec<uint>
(或现代 Rust 中的 usize
)——您的累加器变量不是“对可变向量的引用”,它只是一个“可变向量”。
data[-2]
— Rust 不会隐式地从数组的后面开始索引负值。事实上,索引甚至不接受负值!它想要一个 usize
,所以你的 -2
和 -1
会变成非常大的数字!
我在考虑如何在 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 data
到 fold
.
有没有办法将折叠与 Vec
一起使用?还是我必须求助于循环?
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())
}
您的方法存在一些问题:
data: &mut Vec<uint>
(或现代 Rust 中的usize
)——您的累加器变量不是“对可变向量的引用”,它只是一个“可变向量”。data[-2]
— Rust 不会隐式地从数组的后面开始索引负值。事实上,索引甚至不接受负值!它想要一个usize
,所以你的-2
和-1
会变成非常大的数字!