作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下代码:
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
因为 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');
}
关于rust - 结构错误 : cannot borrow data in a "&" reference as mutable 中的 HashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58424116/
我是一名优秀的程序员,十分优秀!