如何修复错误 E0277:不满足特征绑定 `[usize]: std::marker::Sized` ?

Mat*_*aun 1 rust

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

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

fn main() {
    let arr = [329, 457, 657];
    let res = my_func(inp);
}
Run Code Online (Sandbox Code Playgroud)

我收到错误:

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

fn main() {
    let arr = [329, 457, 657];
    let res = my_func(inp);
}
Run Code Online (Sandbox Code Playgroud)

我知道这些 其他 问题,但它们似乎不适用于我的简单情况。

我该如何修复该错误?

hel*_*low 5

您的问题(以及解决问题的原因&)是,切片在编译时没有已知的大小。

有几种解决方案:

  1. 使用明确的长度

    fn foo(arr: [usize; 3]) { }
    
    Run Code Online (Sandbox Code Playgroud)

使用显式长度将告诉编译器数组有多大,并且现在可以决定为数组保留多少空间。

  1. 使用参考

    fn foo(arr: &[usize]) { }
    
    Run Code Online (Sandbox Code Playgroud)

指向切片的引用(实际上是一个胖指针),其大小在编译时已知(取决于您的体系结构,但通常为 32/64 位)。

  1. 使用堆分配

    fn foo(arr: Box<[usize]> { }
    
    Run Code Online (Sandbox Code Playgroud)

盒子是堆分配的元素(实际上是指针),因此大小也是已知的。

还有其他容器(RcArc、...)接受未调整大小的元素。?Sized您可以轻松地在源代码中找到它们,因为它们对模板参数有要求(请参见Box示例)。