Reference 延长铁锈中的借用寿命
我试图将一个系列解析为令牌树,但当我尝试实现我的解析特性时,我得到了一个与引用生命周期相关的错误。我认为创建一个盒装版本可以解决任何涉及引用计数或生命周期的问题。代码如下Reference 延长铁锈中的借用寿命,reference,rust,lifetime,Reference,Rust,Lifetime,我试图将一个系列解析为令牌树,但当我尝试实现我的解析特性时,我得到了一个与引用生命周期相关的错误。我认为创建一个盒装版本可以解决任何涉及引用计数或生命周期的问题。代码如下 impl Parse for TokenTree { fn parse(&mut self) -> Tree { match self.clone() { TtDelimited(_, y) => { let mut y2 =
impl Parse for TokenTree {
fn parse(&mut self) -> Tree {
match self.clone() {
TtDelimited(_, y) => {
let mut y2 = box (*y).clone();
match y2.delim {
token::DelimToken::Paren => y2.parse(),
_ => panic!("not done yet"),
}
}
TtToken(_, t) => E(t),
_ => panic!("not done yet"),
}
}
}
我得到的错误使问题变得清晰,但我找不到任何关于解决这个特定问题的信息
35:51 error: `*y2` does not live long enough
token::DelimToken::Paren => y2.parse(),
^~
42:6 note: reference must be valid for the anonymous lifetime #1 defined on the block at 30:31...
fn parse(&mut self) -> Tree{
match self.clone(){
TtDelimited(_, y) => {
let mut y2 = box () (*y).clone();
match y2.delim{
token::DelimToken::Paren => y2.parse(),
...
38:14 note: ...but borrowed value is only valid for the block at 32:33
TtDelimited(_, y) => {
let mut y2 = box () (*y).clone();
match y2.delim{
token::DelimToken::Paren => y2.parse(),
_ => panic!("not done yet"),
}
在此代码中:
{
let mut y2 = box (*y).clone();
match y2.delim {
token::DelimToken::Paren => y2.parse(),
_ => panic!("not done yet"),
}
}
您将创建y2
,它将仅在块退出之前有效。您没有包含您的trait,但我猜,parse
返回对对象本身的引用,类似于:
fn parse(&self) -> &str
引用只能持续对象的时间,否则它将指向无效数据
编辑:它可能如何工作
您必须跟踪正在标记化的字符串的生存期,并将您的标记生存期与该输入绑定:
enum令牌(&self,输入:&'a str)->令牌(&self,输入:&'a str)->令牌!在没有看到更多代码的情况下,很难回答这个问题,但我将尝试添加一个带有一些粗略草图的编辑。