我正在构建一个 Rocket 应用程序并希望它为我管理一些对象。为此,他们需要是Send
和Sync
。这是一个最小的人为示例,显示了我得到的错误(Playground):
trait MyTrait {
fn foo(&self) {}
}
struct TraitThing {}
impl MyTrait for TraitThing {
fn foo(&self) {
println!("Foo!");
}
}
struct Thing {
tt: &'static (dyn MyTrait + Send + Sync),
}
impl Thing {
fn with_trait(tt: &'static (dyn MyTrait + Send + Sync)) -> Self {
Self { tt }
}
}
fn main() {
let tt = TraitThing {};
let thing = Thing::with_trait(&tt);
thing.tt.foo();
}
我可能不明白 lifes/ 'static
。理想情况下,我想Thing
拥有tt
,但据我所知,由于我的 TraitThing 不是Sized
(并且可能永远不会),它不能是 trait 对象,因此它必须通过引用传递。
那么,如何在保持Send
和Sync
特征的同时解决这个问题?
谢谢!
附加说明:我在 Rust 书和其他地方阅读了很多关于生命周期和特征的内容,但我希望进一步阅读材料。
您需要使用Box
:
trait MyTrait {
fn foo(&self) {}
}
struct TraitThing {}
impl MyTrait for TraitThing {
fn foo(&self) {
println!("Foo!");
}
}
struct Thing {
tt: Box<dyn MyTrait + Send + Sync>,
}
impl Thing {
fn with_trait(tt: Box<dyn MyTrait + Send + Sync>) -> Self {
Self { tt }
}
}
fn main() {
let tt = TraitThing {};
let thing = Thing::with_trait(Box::new(tt));
thing.tt.foo();
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句