生命周期和所有权与特征

傻瓜

我正在构建一个 Rocket 应用程序并希望它为我管理一些对象。为此,他们需要是SendSync这是一个最小的人为示例,显示了我得到的错误(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 对象,因此它必须通过引用传递。

那么,如何在保持SendSync特征的同时解决这个问题

谢谢!

附加说明:我在 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章