rust - rust 性状-如何在不消耗性状的情况下使用性状?

标签 rust traits

在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

我尝试了各种调用traits notify_state函数的方法,但都失败了。在书中,他们使用类似:
if let Some(s) = self.post_state.take() {
    self.post_state = Some(s.approve_post())
}

但是,首先要在重新实现之前将“状态”设置为“无”。我希望能够在不先使用trait的情况下调用trait的函数。怎么办呢?

最佳答案

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

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

关于rust - rust 性状-如何在不消耗性状的情况下使用性状?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61841843/

相关文章:

json - 错误 : the type of this value must be known in this context (Rust)/serde_json Value

rust - Rust 程序如何从其 Cargo 包中访问元数据?

rust - Rust:特征中的类型引用

floating-point - 使用泛型时如何使用 float 文字?

php - "use"php 文件中的语句

rust - 当比较依赖于数据而不是被比较项目的一部分时,如何实现 Ord?

scala - scala 编译器可以在混合时强制实现抽象特征方法吗?

import - 如何 "use"或导入本地 Rust 文件?

string - 在 Rust 中将字符串切片转换为 int

rust - 如何在 Rust 中指定链接器路径?