Rust 如何修复错误E0277:trait绑定“[usize]:std::marker::Sized”不满足?

Rust 如何修复错误E0277:trait绑定“[usize]:std::marker::Sized”不满足?,rust,Rust,我正在尝试将数组传递给函数: fn my_func(xs: [usize]) -> usize { 0 } fn main() { let arr = [329, 457, 657]; let res = my_func(inp); } 我得到一个错误: 错误[E0277]:未满足特征绑定“[usize]:std::marker::Sized” ->src/main.rs:1:12 | 1 | fn我的函数:[usize]->usize{ |^^`[usize]

我正在尝试将数组传递给函数:

fn my_func(xs: [usize]) -> usize {
    0
}

fn main() {
    let arr = [329, 457, 657];
    let res = my_func(inp);
}
我得到一个错误:

错误[E0277]:未满足特征绑定“[usize]:std::marker::Sized” ->src/main.rs:1:12 | 1 | fn我的函数:[usize]->usize{ |^^`[usize]`在编译时没有已知的常量大小 | =help:trait`std::marker::Sized`未为`[usize]实现` =注意:所有局部变量必须具有静态已知的大小 我知道,但他们似乎不适用于我的简单情况


如何修复错误?

您的问题以及a&修复问题的原因是,片在编译时没有已知的大小

有几种解决方案:

使用显式长度

fn foo(arr: [usize; 3]) { }
使用显式长度将告诉编译器数组有多大,现在可以决定为数组保留多少空间

引用

fn foo(arr: &[usize]) { }
一个指向切片的引用实际上是一个胖指针,编译时它的大小取决于您的体系结构,但通常是32/64位

使用堆分配

fn foo(arr: Box<[usize]> { }
长方体是堆分配的元素,实际上是指针,因此大小也是已知的


还有其他容器Rc、Arc等,它们接受未大小的元素。您可以很容易地在源代码中找到它们,因为它们对模板参数有要求。请参阅。

您的问题以及a&修复您问题的原因是,切片在编译时没有已知的大小

有几种解决方案:

使用显式长度

fn foo(arr: [usize; 3]) { }
使用显式长度将告诉编译器数组有多大,现在可以决定为数组保留多少空间

引用

fn foo(arr: &[usize]) { }
一个指向切片的引用实际上是一个胖指针,编译时它的大小取决于您的体系结构,但通常是32/64位

使用堆分配

fn foo(arr: Box<[usize]> { }
长方体是堆分配的元素,实际上是指针,因此大小也是已知的

还有其他容器Rc,Arc,…接受一个未大小的元素。您可以在源代码中很容易地找到它们,因为它们对模板参数有要求,请参见

我正在尝试将数组传递给函数

fn my_func(xs: [usize])
这不是一个数组,而是一个切片;这就是问题所在。请阅读

正如其他答案所提到的,根据您的目标,有几种潜在的解决方法:

切片[T]没有大小 数组[T;N]有一个大小 对切片和[T]的引用有一个大小 盒装切片盒有一个尺寸 对数组&[T;N]的引用有一个大小 等等

我正在尝试将数组传递给函数

fn my_func(xs: [usize])
这不是一个数组,而是一个切片;这就是问题所在。请阅读

正如其他答案所提到的,根据您的目标,有几种潜在的解决方法:

切片[T]没有大小 数组[T;N]有一个大小 对切片和[T]的引用有一个大小 盒装切片盒有一个尺寸 对数组&[T;N]的引用有一个大小 等等