首页 文章

在尝试从向量中返回值时,获取错误“错误:特征`core :: marker :: Sized`未实现”

提问于
浏览
8

我试图使用以下代码返回向量的值 . 我收到错误消息 .

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

test.rs:19:52:19:57错误:特性core :: marker :: Sized未实现类型[i32] test.rs:19 fn merge <'a>(左:&'a [ i32],右:&'a [i32]) - > [i32] {

我不能为我的生活找到我如何解决这个问题

1 回答

  • 11

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

    Rust拥有向量( Vec<T> ),切片( &[T] )和固定大小的数组( [T; n] ,其中 n 是非负整数,如 6 ) .

    切片由指向数据的指针和长度组成 . 这就是你的 leftright 值 . 但是,切片中未指定的是谁最终 owns the data . 切片只是从其他东西借用数据 . 您可以将 & 视为借用数据的信号 .

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

    特定的错误消息意味着编译器不知道为类型 [i32] 分配了多少空间,因为它通常在您尝试取消引用特征对象时查看Rust中其他内容的此错误,但这与这里的情况 .

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

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

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

相关问题