【问题标题】:Getting the error "the trait Sized is not implemented" when trying to return a value from a vector尝试从向量返回值时出现错误“未实现特征大小”
【发布时间】:2015-01-27 16:41:52
【问题描述】:

我正在尝试返回向量的值:

fn merge<'a>(left: &'a [i32], right: &'a [i32]) -> [i32] {
    let mut merged: Vec<i32> = Vec::new();
    // push elements to merged
    *merged
}

我收到错误消息:

error[E0277]: the size for values of type `[i32]` cannot be known at compilation time
 --> src/lib.rs:1:52
  |
1 | fn merge<'a>(left: &'a [i32], right: &'a [i32]) -> [i32] {
  |                                                    ^^^^^ doesn't have a size known at compile-time
  |
  = help: the trait `std::marker::Sized` is not implemented for `[i32]`
  = note: to learn more, visit <https://doc.rust-lang.org/book/ch19-04-advanced-types.html#dynamically-sized-types-and-the-sized-trait>
  = note: the return type of a function must have a statically known size

我不知道如何解决这个问题。

【问题讨论】:

    标签: rust


    【解决方案1】:

    编译器告诉你不可能返回[T]

    Rust 拥有向量 (Vec&lt;T&gt;)、切片 (&amp;[T]) 和固定大小的数组 ([T; N],其中 N 是一个非负整数,如 6)。

    切片由指向数据的指针和长度组成。这就是您的 leftright 值。但是,切片中没有指定的是最终拥有数据的人。切片只是从其他东西中借用数据。您可以将&amp; 视为数据被借用的信号。

    Vec 是一个拥有数据的东西,可以让其他东西通过切片借用它。对于您的问题,您需要分配一些内存来存储这些值,Vec 会为您执行此操作。然后,您可以返回整个 Vec,将所有权转移给调用者。

    具体的错误信息意味着编译器不知道要为[i32] 类型分配多少空间,因为它从不打算直接分配。你会在 Rust 中的其他事情上看到这个错误,通常是在你尝试取消引用 trait 对象时,但这与这里的情况截然不同。

    这是您想要的最有可能的解决方法:

    fn merge(left: &[i32], right: &[i32]) -> Vec<i32> {
        let mut merged = Vec::new();
        // push elements to merged
        merged
    }
    

    此外,您无需在此处指定生命周期,并且我删除了您的 merged 声明中的冗余类型注释。

    另见:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-13
      • 1970-01-01
      • 1970-01-01
      • 2013-06-16
      • 1970-01-01
      • 1970-01-01
      • 2014-01-21
      • 2021-08-05
      相关资源
      最近更新 更多