Compiler errors 特征法中的锈蚀寿命失配
我正在浏览Rust book,并尝试实现逻辑,以允许文本仅添加到博客Compiler errors 特征法中的锈蚀寿命失配,compiler-errors,rust,lifetime,Compiler Errors,Rust,Lifetime,我正在浏览Rust book,并尝试实现逻辑,以允许文本仅添加到博客Post,如果其处于Draft状态,可以找到(建议的练习之一) 其思想是使用structs和traits在Rust中实现状态模式。我只想将一个字符串片段传递给add_text的默认实现,该实现如果不处于Draft状态,将返回一个空字符串片段。然后,我将覆盖Draft状态的默认实现,并返回为Draft状态的文本传入的字符串片段 pub struct Post { state: Option<Box<dyn St
Post
,如果其处于Draft
状态,可以找到(建议的练习之一)
其思想是使用structs和traits在Rust中实现状态模式。我只想将一个字符串片段传递给add_text
的默认实现,该实现如果不处于Draft
状态,将返回一个空字符串片段。然后,我将覆盖Draft
状态的默认实现,并返回为Draft
状态的文本传入的字符串片段
pub struct Post {
state: Option<Box<dyn State>>,
content: String,
}
impl Post {
pub fn new() -> Post {
Post {
state: Some(Box::new(Draft {})),
content: String::new(),
}
}
pub fn add_text(&mut self, text: &str) {
let text = self.state.as_ref().unwrap().add_text(text);
// self.state.as_ref().unwrap().add_content(text)
self.content.push_str(text);
}
//snip
trait State {
fn request_review(self: Box<Self>) -> Box<dyn State>;
fn approve(self: Box<Self>) -> Box<dyn State>;
fn content<'a>(&self, post: &'a Post) -> &'a str {
""
}
fn reject(self: Box<Self>) -> Box<dyn State>;
fn add_text(&self, text: &str) -> &str {
""
}
}
struct Draft {}
impl State for Draft {
fn request_review(self: Box<Self>) -> Box<dyn State> {
Box::new(PendingReview {})
}
fn approve(self: Box<Self>) -> Box<dyn State> {
self // don't want to approve a draft before review!
}
fn reject(self: Box<Self>) -> Box<dyn State> {
self // reject doesn't do anything on a draft!
}
fn add_text(&self, text: &str) -> &str {
text
}
}
我是个新手,在这种情况下无法获得正确的终身注释。我尝试了显式的生命周期注释,但没有帮助。另外,我知道,由于其中一个引用是&self
,所有生存期参数都应该自动(我想?)具有与&self
相同的生存期
有人能告诉我如何编译这段代码吗?它也可能对将来使用本书的人有用。您被以下内容绊倒:
输入位置的每个省略寿命都成为一个不同的寿命参数
如果只有一个输入生存期位置(省略或不省略),则该生存期将分配给所有省略的输出生存期
如果有多个输入生存期位置,但其中一个是&self
或&mut self
,则self
的生存期分配给所有省略的输出生存期
否则,省略输出生存期是错误的
在代码fn add_text(&self,text:&str)->&str
中,返回的&str
从&self
中提取省略的生存期,但实际上它是第二个参数。不匹配,就好像它是:
fn添加文本(&'a self,text:&'b str)->&'a str{
文本
}
诀窍是在这里明确生命周期:
特征状态{
fn add_text非常感谢;我想尝试一下,但我固执地相信我对省略规则的理解,因此没有尝试。我只是假设,由于与&self
的生存期匹配的输出生存期将被推断为比text
的生存期更长,因此不需要指定。但是事实并非如此。
lifetime mismatch
...but data from `text` is returned hererustc(E0623)
lib.rs(67, 30): this parameter and the return type are declared with different lifetimes...
lib.rs(67, 39):
lib.rs(68, 9): ...but data from `text` is returned here