为什么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 }
}
我不明白为什么一个实现了trait的变量
Test
不能被克隆,毕竟它只是一个指针。这个限制阻止了例如从&[&'a SomeTrait]
到Vec<&'a SomeTrait>
这样显然的转换,或者像示例中那样克隆一个Vec<&'a SomeTrait>
。很奇怪的是,即使没有
Clone
,我也可以自己实现clone_vec()
: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
}