工厂方法:实例寿命不够长

时间:2015-05-02 20:24:30

标签: rust

我在Rust开发一个文字生成器。该应用程序包含两个主要结构:LetterAlphabet

Letter由一个字符和与其他字母关系的规则组成。

Alphabet包含元音和辅音的向量,以及引用这些向量中字母的散列映射。这样做是为了在O(1)时间内检索字母规则。

我已经创建了一个工厂方法来从json字符串读取字母表(下面的代码),但是我收到一条错误,指出字母表实例的活动时间不够长。

  

src / word_generator / alphabet.rs:47:6:47:14错误:alphabet没有   足够长的src / word_generator / alphabet.rs:47                     alphabet.add_letter(字母);

     

src / word_generator / alphabet.rs:26:40:55:3注意:必须参考   适用于26:39在块上定义的匿名生命#1 ...   src / word_generator / alphabet.rs:26 pub fn from_json(json:   &安培; STR) - >字母表{

     

注意:...但借来的值仅对块后缀有效   以下声明3在40:37 src / word_generator / alphabet.rs:40 let   mut alphabet = Alphabet :: new(); SRC / word_generator / alphabet.rs:41

我理解错误(我希望),但我不明白为什么会这样。为什么函数Alphabet返回的new()实例由变量alphabet借用?这不是一个移动行动吗?

pub struct Alphabet<'a>{
    pub vowels: Vec<Letter>,
    pub consonants: Vec<Letter>,
    letters: HashMap<char,&'a Letter>
}

impl<'a> Alphabet<'a>{

    pub fn new()->Alphabet<'a>{

        return Alphabet{
            vowels: Vec::new(),
            consonants: Vec::new(),
            letters: HashMap::new()
        }

    }

    pub fn from_json(json: &str)->Alphabet{

        let data :Json = match Json::from_str(json){
            Ok(_data)=>_data,
            Err(_err)=>panic!("Invalid JSON provided")
        };

        let letters = match data.as_array(){
            Some(_letters)=>_letters,
            None=>panic!("Expected JSON\'s root to be an array but found a different structure.")
        };

        let mut it = letters.iter();

        let mut alphabet = Alphabet::new();

        loop {
            match it.next(){
                Some(x) =>{

                    let letter : Letter= json::decode(&(x.to_string())).unwrap();
                    alphabet.add_letter(letter);

                },
                None => break,
            }
        }

        return alphabet
    }

    fn add_letter(&'a mut self,ref l: Letter){

        match l.letter_type {
            LetterType::Vowel =>{
                self.vowels.push(l.clone());
                self.letters.insert(l.value, &self.vowels.last().unwrap());
            },
            LetterType::Consonant =>{ 
                self.consonants.push(l.clone());
                self.letters.insert(l.value, &self.consonants.last().unwrap());
            }
        }

    }
}

P.S。:我对Rust来说很陌生,因此欢迎任何改进代码的建议。

0 个答案:

没有答案