我在Rust开发一个文字生成器。该应用程序包含两个主要结构:Letter
和Alphabet
。
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来说很陌生,因此欢迎任何改进代码的建议。