如何解决错误E0277:特质绑定`[usize]:std :: marker :: Sized`不满意?

时间:2018-08-02 09:35:29

标签: rust

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

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,但它们似乎不适用于我的简单情况。

如何解决该错误?

2 个答案:

答案 0 :(得分:4)

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

有几种解决方案:

  1. 使用明确的长度

    fn foo(arr: [usize; 3]) { }
    

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

  1. 使用参考

    fn foo(arr: &[usize]) { }
    

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

  1. 使用堆分配

    fn foo(arr: Box<[usize]> { }
    

盒子是堆分配的元素(实际上是一个指针),所以大小也是众所周知的。

还有其他容器(RcArc,...)可以接受大小不一的元素。您可以轻松地在源代码中发现它们,因为它们的模板参数要求?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])的大小

以此类推。