Rust Traits - 如何在不消耗特性的情况下使用它?
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();
}
我尝试了多种调用 traits announce_state 函数的方法,但都失败了。在书中,他们使用类似的东西:
if let Some(s) = self.post_state.take() {
self.post_state = Some(s.approve_post())
}
但是,这样做首先要在重新实现之前将 'state' 设置为 None。我希望能够在不首先使用特性的情况下调用特性的函数。这将如何完成?
你的announce_state(self: Box<Self>)
定义为移动值。而是将其定义为 announce_state(&self)
然后它就可以工作了。
在 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();
}
我尝试了多种调用 traits announce_state 函数的方法,但都失败了。在书中,他们使用类似的东西:
if let Some(s) = self.post_state.take() {
self.post_state = Some(s.approve_post())
}
但是,这样做首先要在重新实现之前将 'state' 设置为 None。我希望能够在不首先使用特性的情况下调用特性的函数。这将如何完成?
你的announce_state(self: Box<Self>)
定义为移动值。而是将其定义为 announce_state(&self)
然后它就可以工作了。