首页 > 解决方案 > 为什么 [u8] 没有实现 Clone?

问题描述

下面的示例只是一个示例,我知道我不需要 Clone 才能工作,但如果是一个带有andS的枚举并且我想调整向量的大小,则必须是.[T]Vec<T>TClone

struct S<'a, T>{
    a: &'a [T]
}

impl<'a, T> S<'a, T> {
    pub fn borrow(&self) -> &[T] 
    where [T]: Clone {
        self.a
    }
}

fn main() {
    let slice:[u8;3] = [1,2,3]; 
    let x = S{a: &slice};
    x.borrow();
}

操场

错误:

error[E0277]: the trait bound `[u8]: Clone` is not satisfied
  --> src/main.rs:17:7
   |
17 |     x.borrow();
   |       ^^^^^^ the trait `Clone` is not implemented for `[u8]`

那么,为什么不[u8] Clone呢?

标签: rust

解决方案


那为什么不[u8] Clone呢?

查看clone定义中方法的类型Clone

pub trait Clone {
    pub fn clone(&self) -> Self;
    // more stuff omitted..
}

它返回Self[u8]在这种情况下就是这样。问题是[u8]不是Sized,也就是说,因为我们不知道它会有多少元素,所以在编译时我们无法知道它的大小。但是从这个方法返回它意味着它被移动到堆栈上,如果编译器不知道要为它留下多少空间,这是不可能的。


推荐阅读