【发布时间】:2017-02-06 19:09:06
【问题描述】:
我仍在学习 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 语句之后。
【问题讨论】:
-
(current_dist == None) | (state.cost < *current_dist.unwrap())我无法想象你想要一个按位或操作。 -
请查看如何创建minimal reproducible example。您尚未定义
Node、State或heap是什么。 -
我更正了
||。State的定义似乎隐含在state的创建中,而Node和heap似乎并不相关(Node是一组坐标,heap是一个堆)。 -
和
Node和heap似乎不相关 - 然后从您的问题中删除它们。再次,我强烈建议您查看minimal reproducible example 的含义;强调Minimal。这样做的原因有两个:1. 通过减少问题,您更有可能自己解决问题,2. 减少的问题更容易让 其他 人快速理解。这些人包括回答者和找到您问题的未来提问者。
标签: rust borrow-checker