rust 意外借用的值在方法调用后没有足够长的时间

dfty9e19  于 2023-01-21  发布在  其他
关注(0)|答案(1)|浏览(128)

我试图在一个不断深化的有限状态空间中迭代,同时保持一组可见状态。下面的函数是不完整的,但定义足够说明我遇到的问题。

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;
v8wbuo2f

v8wbuo2f1#

@eggyal的第二条评论让我明白了这个问题。我以前只尝试过在ValveState函数声明中定义'a的生存期,而不是像impl<'a> ValveState<'a>那样。我显然需要巩固我对这些东西之间的区别的理解,谢谢你的更正。

相关问题