【发布时间】:2018-02-23 18:18:07
【问题描述】:
在阅读 Rust 书(第 2 版)的 OOP-Chapter 时,我承担了可选任务来为以下结构实现方法 add_text
pub struct Post {
state: Option<Box<State>>,
content: String,
}
有三个结构体实现了State trait,但只有Draft 结构体真正应该做一些事情。我是这样实现的
trait State {
// snip
fn add_text(&self, post: &mut Post, text: &str) { }
}
struct Draft { }
impl State for Draft {
// snip
fn add_text(&self, post: &mut Post, text: &str) {
post.content.push_str(text);
}
}
我的问题是,为了从我的 post 结构中获取 State 以调用 add_text 方法,我不可变地借用 self(在 Post 中)并且不能传递对 @987654331 的可变引用State trait 的 @ 方法:
impl Post {
// snip
pub fn add_text(&mut self, text: &str){
let state = self.state.as_ref().unwrap(); // This immutably borrows self
state.add_text(self, text); // so that this mutable borrow is no longer possible
}
}
我该如何处理这个困境?我绝对需要对Post 的可变引用,否则我无法更改其文本。另一方面,我需要先获取State,否则我什至无法调用该方法。
解决此问题的一种方法是将add_text 更改为get_text_to_add,这不需要Post 的可变性,但我想确保我没有监督任何解决此问题的选项。
【问题讨论】:
-
这对我来说看起来像代码味道。首先,
Draft上的State::add_text方法 impl 与Draft结构 whatsoever 无关 - 您不妨删除&self参数并完成它。其次,作为这个假设库的外部使用者,我希望add_text方法位于Post结构本身上。您最好将add_text移动到Post,并在需要时查找信息或更改state字段。如果你只想add_text,如果帖子是草稿,你可以检查self.state是否是Draft里面Post::add_text。
标签: rust