如何使用另一个数组的长度来初始化Rust中的数组?

时间:2017-03-27 15:46:27

标签: arrays rust

我想初始化一个长度等于另一个数组长度的数组:

fn foo(array: &[i32]) {
    let mut sum = [0; array.len()];
}

会出错:

error[E0080]: constant evaluation error
  --> test.rs:22:18
   |
22 |    let mut sum = [0; array.len()];
   |                      ^^^^^^^^^^^ unsupported constant expr

我想我必须使用这个len()论证......我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

您实际上是在获取切片的长度,而不是数组。必须在编译时知道数组长度。作为切片长度的array.len()可能来自运行时输入,因此不能用作数组长度。您可以改为创建矢量。例如:

use std::iter::repeat;

fn foo(slice: &[i32]){
    let mut sum: Vec<i32> = repeat(0).take(slice.len()).collect();
    // ......
}

答案 1 :(得分:2)

回答问题:

  

如何使用另一个数组的长度来初始化Rust中的数组?

你做不到。数组是数据结构,其中长度在编译时定义。另外,没有办法静态地告诉任意数组的长度。它也不可能编写像

这样的通用代码
fn foo(array: [u8; N]) -> [u8; N] {
     unimplemented!()
}

当前的解决方案是特征和宏的组合。这具有局限于一组类型的明显缺点。这在Why does println! work only for arrays with a length less than 33?

等问题中进一步讨论

展示基于Vec的代码的更短,更惯用的版本:

fn foo(slice: &[i32]) {
    let mut sum = vec![0; slice.len()];
}