对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对象的结构体?