我有以下代码:
struct Node{
node_map: HashMap<char, Node>,
value: Option<i32>,
}
struct Trie {
root: Node,
}
impl Trie {
fn new() -> Trie {
Trie {
root: Node{
node_map: HashMap::new(),
value: None,
},
}
}
fn find(&self, key: &String) -> Option<&Node> {
// Returning some Option<&Node>
}
fn delete(&mut self, key: &String) -> Option<i32> {
// extract code snippet
let mut search_node = self.find(key);
if search_node.is_some() {
search_node.unwrap().node_map.remove(& 'x');
}
None
}
}
Rust抱怨search_node.unwrap().chs
部分下的错误:不能借用“&”引用中的可变数据
所以我知道find
函数返回Option<&Node>
,所以在上一行展开时,我得到了对Node
的引用。
尝试:
*search_node.unwrap().node_map.remove(& 'x');
或*(search_node.unwrap()).node_map.remove(& 'x');
,但仍然会引发错误。node_map
易变,例如: struct Node<'a> {
node_map: &'a mut HashMap<char, Node<'a>>,
value: Option<i32>,
}
但是后来我抱怨缺少一生。我不知道如何添加的一个特定地方是new
函数。
请让我知道如何解决原始问题或如何增加适当的寿命。
答案 0 :(得分:1)
问题在于find
返回一个(可选的)不可变引用,但是您稍后尝试对其进行突变。因此,您可能要添加带有签名的方法find_mut
fn find_mut(&mut self, key: &str) -> Option<&mut Node>
(我将key
的参数更改为&str
,因为it's discouraged to take &String
as an argument)
另一种风格上的东西:您应该使用if let
而不是检查search_node
是否存在然后再展开。
if let Some(search_node) = self.find_mut(key) {
search_node.node_map.remove(&'x');
}