Rust 锈菌特性-我如何使用特性而不消耗它?

Rust 锈菌特性-我如何使用特性而不消耗它?,rust,traits,Rust,Traits,在铁锈书第17章中,它展示了一些特征的例子。在一组示例中,他们通过在结构中具有dyn特征来解释如何使用状态。但是,在使用的例子中,他们总是重新设置特征。我试图使用一种特质而不去扩展它,事实证明这很难: struct Post { post_state: Option<Box<dyn PostState>>, } trait PostState { fn announce_state(self: Box<Self>); } impl Post

在铁锈书第17章中,它展示了一些特征的例子。在一组示例中,他们通过在结构中具有dyn特征来解释如何使用状态。但是,在使用的例子中,他们总是重新设置特征。我试图使用一种特质而不去扩展它,事实证明这很难:

struct Post {
    post_state: Option<Box<dyn PostState>>,
}

trait PostState {
    fn announce_state(self: Box<Self>);
}

impl Post {
    pub fn new() -> Post {
        Post {
            post_state: Some(Box::new(Draft{})),
        }
    }
    pub fn announce_state(&self) {
        if let Some(s) = self.post_state.as_ref() {
            s.announce_state();
        }
    }
}

struct Draft{}

impl PostState for Draft {
    fn announce_state(self: Box<Self>) {
        println!("Draft");
    }
}

fn main() {
    let mut my_post = Post::new();
    my_post.announce_state();
}
但是,在重新实现之前,首先将“状态”设置为“无”。我希望能够调用某个特性的函数,而不必首先使用它。如何执行此操作?

您的公告状态self:框已定义为移动值。相反,将其定义为annou_state&self,然后它就可以工作了

例如:

太好了。跟进:如果“self:&self”足够,为什么本书使用“self:Box”?此链接显示“do_little”和“request_review”,在fn中使用具有相同代码的对立面。有什么区别?
if let Some(s) = self.post_state.take() {
    self.post_state = Some(s.approve_post())
}