我有以下代码:
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
功能。
请让我知道如何解决原始问题或如何添加适当的生命周期。
问题是find
返回一个(可选的(不可变引用,但稍后您尝试对其进行更改。因此,您可能希望添加带有签名的方法find_mut
fn find_mut(&mut self, key: &str) -> Option<&mut Node>
(我将key
参数更改为&str
,因为不鼓励将&String
作为参数(
另一个风格:你应该使用if let
而不是检查search_node
是一些然后解开包装。
if let Some(search_node) = self.find_mut(key) {
search_node.node_map.remove(&'x');
}