繁体   English   中英

Rust 特质 - 如何在不消耗特质的情况下使用它?

[英]Rust Traits - How can I use a trait without expending it?

在 Rust 一书(第 17 章)中,它展示了一些特征示例。 在一组示例中,他们通过在结构中具有动态特性来解释使用状态。 但是,在使用示例中,它们总是重置特征。 我试图在不消耗特性的情况下使用特性,事实证明这很困难:

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 function 的方法,但都失败了。 在书中,他们使用类似的东西:

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

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

您的announce_state(self: Box<Self>)被定义为移动值。 而是将其定义为announce_state(&self)然后它就可以工作了。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM