我想初始化一个长度等于另一个数组长度的数组:
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()
论证......我该如何解决这个问题?
答案 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()];
}