【问题标题】:Rust Traits - How can I use a trait without expending it?Rust Traits - 我如何在不消耗它的情况下使用它?
【发布时间】:2020-09-02 14:43:27
【问题描述】:

在 Rust 的书(第 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();
}

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=f88125ab8848d9350a2248ae29843eba

我尝试了各种调用特征announce_state 函数的方法,但都失败了。在书中,他们使用了类似的东西:

if let Some(s) = self.post_state.take() {
    self.post_state = Some(s.approve_post())
}

但是,首先要在重新实现之前将“状态”设置为无。我希望能够在不首先使用特征的情况下调用特征函数。这将如何实现?

【问题讨论】:

    标签: rust traits


    【解决方案1】:

    您的announce_state(self: Box&lt;Self&gt;) 被定义为移动值。而是将其定义为announce_state(&amp;self),然后它将起作用。

    示例: https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=463e5166de4168b880173a35379cb4a2

    【讨论】:

    • 太完美了。追问:如果'self:&Self'足够了,为什么这本书使用'self:Box'? play.rust-lang.org/… 此链接显示“do_little”和“request_review”在 fn 中使用相同代码的对立面。有什么区别?
    猜你喜欢
    • 2022-11-05
    • 2012-12-24
    • 2021-12-21
    • 1970-01-01
    • 2021-05-08
    • 2019-10-04
    • 2022-01-14
    • 1970-01-01
    • 2015-12-26
    相关资源
    最近更新 更多