2014-12-19 1 views
1

Я пытаюсь разобрать серию для токенов, но когда я пытаюсь реализовать свой синтаксический анализ, я получаю ошибку, связанную с эталонными сроками службы. Я думал, что создание коробчатой ​​версии будет касаться любых проблем с подсчетом ссылок или временем жизни. Код выглядит следующим образом.Продление срока службы заимствований в ржавчине

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"), 
      } 

ответ

3

В этом коде:

{ 
    let mut y2 = box (*y).clone(); 
    match y2.delim { 
     token::DelimToken::Paren => y2.parse(), 
     _ => panic!("not done yet"), 
    } 
} 

Вы создаете y2, который будет жить только до тех пор блок выходов. Вы не включили свой признак, но я думаю, что parse возвращает ссылку на сам объект, что-то вроде:

fn parse(&self) -> &str 

Ссылка может только продолжаться до тех пор, пока объект, в противном случае было бы указать на недействительные данные.

Edit: Как это может быть может, возможно, работать

Вы должны отслеживать срок службы струны вы tokenizing и связать свой срок службы токенов к этому входу:

enum Token<'a> { 
    Identifier(&'a str), 
    Whitespace(&'a str), 
} 

trait Parser { 
    // Important! The lifetime of the output is tied to the parameter `input`, 
    // *not* to the structure that implements this! 
    fn parse<'a>(&self, input: &'a str) -> Token<'a>; 
} 

struct BasicParser; 

impl Parser for BasicParser { 
    fn parse<'a>(&self, input: &'a str) -> Token<'a> { 
     Token::Identifier(input) 
    } 
} 
+0

Могу ли я работать вокруг этого, используя явные времена жизни? – ragingSloth

+0

Возможно! Это намного сложнее ответить, не видя больше вашего кода, но я попытаюсь добавить редактирование с некоторыми грубыми эскизами. – Shepmaster