[英]How to box a dyn trait with interface function consume itself?
来自https://doc.rust-lang.org/rust-by-example/trait/dyn.html ,众所周知,编译时不知道 dyn trait 的大小,因此我们不能将其用作返回值。 但是什么时候可以创建一个引用并将其放入盒子中,盒子的大小是固定的。
但是我遇到了一个问题,我怎样才能装箱一个有接口的 tait 来消费它。
#[tokio::test]
async fn test_dyn_trait() {
trait Consume {
fn usage(self) -> String;
}
trait Refer {
fn usage(&self) -> String;
}
struct Man {
name: String,
}
impl Consume for Man {
fn usage(self) -> String {
let Man { name } = self;
return name;
}
}
impl Refer for Man {
fn usage(&self) -> String {
return self.name.clone();
}
}
let a: Box<dyn Consume> = Box::new(Man {
name: "aaron".to_string(),
});
let b: Box<dyn Refer> = Box::new(Man {
name: "aaron".to_string(),
});
println!("a: {}", a.usage()); // cannot move a value of type dyn Consume: the size of dyn Consume cannot be statically determined
println!("b: {}", b.usage()); // it is ok
}
这是不可能的。 Rust 有一个叫做object safety的东西,它可以防止创建特征的特征对象,这些特征的方法要么接受或返回Self
(并耦合其他东西)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.