我正在尝试将数组传递给函数:
fn my_func(xs: [usize]) -> usize {
0
}
fn main() {
let arr = [329, 457, 657];
let res = my_func(inp);
}
我得到了错误:
error[E0277]: the trait bound `[usize]: std::marker::Sized` is not satisfied
--> src/main.rs:1:12
|
1 | fn my_func(xs: [usize]) -> usize {
| ^^ `[usize]` does not have a constant size known at compile-time
|
= help: the trait `std::marker::Sized` is not implemented for `[usize]`
= note: all local variables must have a statically known size
我了解these other questions,但它们似乎不适用于我的简单情况。
如何解决该错误?
答案 0 :(得分:4)
您的问题(以及&
解决您问题的原因)是,切片在编译时没有已知大小。
有几种解决方案:
使用明确的长度
fn foo(arr: [usize; 3]) { }
使用显式长度将告诉编译器数组有多大,现在可以决定为数组保留多少空间。
使用参考
fn foo(arr: &[usize]) { }
一个引用指向切片(实际上是一个胖指针),切片的大小在编译时是已知的(取决于您的体系结构,但通常为32/64位)。
使用堆分配
fn foo(arr: Box<[usize]> { }
盒子是堆分配的元素(实际上是一个指针),所以大小也是众所周知的。
还有其他容器(Rc
,Arc
,...)可以接受大小不一的元素。您可以轻松地在源代码中发现它们,因为它们的模板参数要求?Sized
(请参见Box
example)。
答案 1 :(得分:2)
我正在尝试将数组传递给函数
fn my_func(xs: [usize])
这不是不是数组,它是切片;那就是问题所在。阅读What is the difference between a slice and an array?
如其他答案所述,根据您的目标,有几种解决问题的潜在途径:
[T]
)没有大小[T; N]
)的大小&[T]
)的引用大小Box<[T]>
)的大小&[T; N]
)的大小以此类推。