我试图在一个不断深化的有限状态空间中迭代,同时保持一组可见状态。下面的函数是不完整的,但定义足够说明我遇到的问题。
fn get_possible_final_results(&self, mut seen: BTreeSet<ValveState>) -> Vec<u16> {
if self.is_done() {
return vec![self.result];
}
let mut successors = self.get_successors();
let mut results = Vec::new();
while !successors.is_empty() {
let successor = successors.pop().unwrap();
if seen.contains(&successor) {
continue;
}
let new_successors = successor.get_successors();
successors.extend(new_successors);
seen.insert(successor);
}
return results;
}
下面是get_successors的签名:返回的ValveState
没有引用self
(或者至少它们不应该引用)。
编译器暗示successor在某个时候被借用到方法调用的长度之外,但我不明白是如何或为什么。
error[E0597]: `successor` does not live long enough
--> src\main.rs:78:34
|
67 | fn get_possible_final_results(&self, mut seen: BTreeSet<ValveState>) -> Vec<u16> {
| -------- has type `BTreeSet<ValveState<'2>>`
...
78 | let new_successors = successor.get_successors();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ borrowed value does not live long enough
79 | successors.extend(new_successors);
80 | seen.insert(successor);
| ---------------------- argument requires that `successor` is borrowed for `'2`
81 | }
| - `successor` dropped here while still borrowed
调用get_successors
不应该只在方法调用期间借用successor
吗?我误解了这个问题吗?
我尝试过引入不同的生存期(我还在掌握),但没有效果。我也尝试过在其他地方搜索这个错误,我确信它就在那里,但我无法找到解决这个特定情况的解释。
正如你可能知道的,我还在适应 rust 。任何帮助都是感激的,即使你不得不解释它像我五岁。谢谢!
下面是关于ValveState
的更多信息以及它是如何在get_successors
中构造的:
struct ValveState<'a> {
network: &'a ValveNetwork<'a>,
player_position: &'a str,
open_valves: BTreeSet<&'a Valve<'a>>,
steps_left: u16,
result: u16
}
在get_successors
中构造ValveState
的示例:
let new_state = ValveState {
network: self.network,
player_position: self.player_position,
open_valves: self.open_valves.clone(),
steps_left: self.steps_left - 1,
result: self.result+ self.get_step_result()
};
successors.push(new_state);
return successors;
1条答案
按热度按时间v8wbuo2f1#
@eggyal的第二条评论让我明白了这个问题。我以前只尝试过在
ValveState
函数声明中定义'a
的生存期,而不是像impl<'a> ValveState<'a>
那样。我显然需要巩固我对这些东西之间的区别的理解,谢谢你的更正。