对特征对象的引用不可克隆

时间:2014-05-02 11:01:24

标签: traits rust

为什么对trait对象的引用不可复制?此代码编译:

struct Test;

fn clone_vec<'a>(v: Vec<&'a Test>) -> Vec<&'a Test> {
    v.clone()
}

fn main() {
}

这个没有:

trait Test {
    fn do_smt(&self);
}

fn clone_vec<'a>(v: Vec<&'a Test>) -> Vec<&'a Test> {
    v.clone()
}

fn main() {
}

错误:

main3.rs:7:5: 7:14 error: failed to find an implementation of trait std::clone::Clone for &'a Test<no-bounds>
main3.rs:7     v.clone()
               ^~~~~~~~~

但是,就我所见,Clone特征是针对任何类型的参考实现的:

impl<'a, T> Clone for &'a T {
    /// Return a shallow copy of the reference.
    #[inline]
    fn clone(&self) -> &'a T { *self }
}

我只是不明白为什么&'a Test Test是一个特征是不可克隆的。毕竟它只是一个指针。例如,此限制禁止从&[&'a SomeTrait]转到Vec<&'a SomeTrait>,这看起来像是一个明显的转换,或克隆Vec<&'a SomeTrait>,如示例所示。

这很奇怪,前提是我可以自己实施clone_vec(),而不是Clone

fn clone_vec<'a>(v: Vec<&'a Test>) -> Vec<&'a Test> {
    let mut result = Vec::new();
    for &e in v.iter() {
        result.push(e);
    }
    result
}

1 个答案:

答案 0 :(得分:6)

Clone是一个普通的库特征,需要所有类型的普通(库)实现。例如,Clone已为&T right here实施,其形式为:

impl<'a, T> Clone for &'a T {
    /// Return a shallow copy of the reference.
    #[inline]
    fn clone(&self) -> &'a T { *self }
}

因此,&T形式的所有内容都是Clone能够...... T具体类型。这就是关键:&Trait不是(还)一种&T形式的T = Trait(而是一种&#34;原子&#34; /基本类型这不能被分成几部分),因此impl不涵盖它。

我们需要动态大小的类型(DST),以便编译器能够推断只传递普通旧Trait作为通用参数(Nick Cameron实际上在DST实现的某些部分很难工作,所以很快就会发生这种情况。)

但是,您可以针对您感兴趣的特征手动实施Clone,例如以下效果很好:

trait Foo {}

impl<'a> Clone for &'a Foo {
    fn clone(&self) -> &'a Foo {
        *self
    }
}

但是,它仅适用于当前包中定义的特征,否则编译器会担心一致性(例如,在Foo上面Eq更改为impl会导致{{1 }})。