在性状克隆上挣扎

  • 本文关键字:挣扎 rust
  • 更新时间 :
  • 英文 :


对Trait的实现/使用有些新:

如果我这样声明trait:

pub trait A: Debug + Clone {
fn as_base58_string(&self) -> String;
fn as_bytes(&self) -> [u8; 32];
}

具体实现:

impl A for P {
fn as_base58_string(&self) -> String {
self.to_base58_string()
}
fn as_bytes(&self) -> [u8; 32] {
self.to_bytes()
}
}

有一个函数,如:

pub fn print_akey(akey: &dyn A) {
println!("A{:?}", akey);
}

我得到这个错误

the trait `A` cannot be made into an object`A` cannot be made into an object

即使具体类型P是可克隆的?

如果我从trait声明中删除Clone,警告将消失/

Clone不是对象安全的。这意味着您不能创建dyn Clone,因此您不能为任何具有Clone作为超性状的Trait创建dyn Trait

原因是Clone::clone()返回Self,对象安全特性的规则之一是它们绝不能提及Self类型(除了&self&mut self)。

如果你想克隆一个trait对象(dyn Trait),请参见如何克隆一个存储盒装trait对象的结构体?

最新更新