Compiler errors 特征法中的锈蚀寿命失配

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

我正在浏览Rust book,并尝试实现逻辑,以允许文本仅添加到博客
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