编者注:在Rust 1.0之前问过这个问题,问题中的一些断言在Rust 1.0中不一定正确.一些答案已更新,以解决这两个版本.
我想创建一个向量,但我只知道我希望向量在运行时的大小.这就是我现在正在做的事情(即创建一个空的,可变的向量,并向其添加向量):
fn add_pairs(pairs: ~[int]) -> ~[int] {
let mut result : ~[int] = ~[];
let mut i = 0;
while i < pairs.len() {
result += ~[pairs[i] + pairs[i + 1]];
i += 2;
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
这就是我想要的方式(即创建一个向量并将所有内容放入其中,而不是一起添加大量向量):
fn add_pairs(pairs: ~[int]) -> ~[int] {
let number_of_pairs = pairs.len() / 2;
let result : ~[int, ..number_of_pairs];
let mut i = 0;
while i < pairs.len() {
result[i] = pairs[2 * i] + pairs[2 * i + 1];
i += 1;
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,做到这一点给了我类似的东西:
error: expected constant expr for vector length: Non-constant path in constant expr
let result: ~[int, ..number_of_pairs];
^~~~~~~~~~~~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)
我得到的印象是向量必须在编译时知道它们的大小(因此你需要将它们的大小设置为常量).来自Java背景,我很困惑!有没有办法创建一个只在运行时知道它的大小的向量?
我正在使用Rust 0.6.
小智 15
在Rust版本1.0.0中,它们使std::vec:Vec公共结构稳定,以便您可以实例化一个可增长的向量.let mut my_vec = Vec::new();您也可以vec!像这样使用宏:let mut another_vec = vec![1isize, 2isize, 3isize];重要的是要注意,在这两种情况下,您分配的变量必须是可变的.
使用这些向量,您可以调用my_vec.push(num);单个项目或another_vec.extend_from_slice(["list", "of", "objects"]);将项目添加到向量的末尾.
对于您的具体问题,您可以执行以下操作:
fn add_pairs(pairs: Vec<(Vec<isize>)>) -> Vec<isize> {
let mut result = Vec::new();
for pair in pairs.iter() {
result.push(pair[0]);
result.push(pair[1]);
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
你可以在Rust Playground上看到这个(你假设的)是整数对的嵌套向量.
huo*_*uon 11
没有办法创建一个常量长度的数组,其长度在运行时确定; 只允许编译时常量长度数组,因此Vec<i32>(先前~[int])的第一个方法的(变体)是唯一受支持的方式.您可以使用vec![0; number_of_pairs]创建正确大小的矢量并使用第二部分.
你想要做的事情有许多帮助函数(while直接使用Rust应该非常罕见):
fn add_pairs(pairs: &[i32]) -> Vec<i32> {
let mut result = Vec::new();
for i in 0..(pairs.len() / 2) {
result.push(pairs[2 * i] + pairs[2 * i + 1])
}
result
}
Run Code Online (Sandbox Code Playgroud)
甚至
fn add_pairs(pairs: &[i32]) -> Vec<i32> {
pairs
.chunks(2)
.filter(|x| x.len() == 2)
.map(|x| x[0] + x[1])
.collect()
}
Run Code Online (Sandbox Code Playgroud)
文档:chunks,filter,map,collect.(这filter只是因为最后一个元素chunks可能有长度为1.)
另请注意,添加两个向量会分配一个全新的向量,而push不是必须这样做并且速度更快(并且.collect类似).
| 归档时间: |
|
| 查看次数: |
5616 次 |
| 最近记录: |