我正在学习Rust语言,最近在进行一个训练项目时,尝试实现Dikjstra算法时遇到了一个奇怪的问题。首先,我定义了一个HashMap
:
let mut dist: HashMap<Node, usize> = HashMap::new();
后来:
let state = State { node: next_node.clone(), cost: cost + 1 };
let current_dist = dist.get(&state.node);
if (current_dist == None) || (state.cost < *current_dist.unwrap()) {
dist.insert(state.node.clone(), state.cost);
heap.push(state);
}
由于
dist.get
触发了一个不可变借用,该借用将保持有效直到if ... {...}
语句之后,尤其是当我调用dist.insert
请求可变借用时,会导致编译错误。我认为我缺少一种允许我进行此类处理的模式或关键字。目前,我尝试在
if
作用域的开头使用drop
,以及其他current_dist
评估方式。let current_dist;
{
current_dist = dist.get(&state.node);
}
或者
let current_dist = {|| dist.get(&state.node)}();
但是不可变借用的作用域仍然发生在if
语句之后。
Node
、State
或heap
是什么。 - Shepmaster||
。通过创建state
,State
的定义似乎是暗示的,而Node
和heap
似乎不相关(Node
是一组坐标,heap
是一个堆)。 - ThrastylonNode
和heap
似乎不相关。我强烈建议您查看我们所说的[MCVE]并强调Minimal。这样做的原因有两个:1.通过缩小问题范围,您更有可能自己解决问题,2.缩小的问题更容易让其他人快速理解。这些人包括回答者和将来发现您问题的人。 - Shepmaster