gpt4 book ai didi

rust - Rust-无法借用对捕获树中结构的引用

转载 作者:行者123 更新时间:2023-12-03 11:28:53 25 4
gpt4 key购买 nike

我有一个带有节点和子节点的树形结构,以及一个循环(来自gui库),该循环期望函数在每次迭代中运行。我正在努力让借用检查器让我保持对正在处理的节点的引用-它提示nodes的生命周期不够长。
这是最小的复制品:

#[derive(Debug)]
struct Node {
value: u64,
children: Vec<Node>
}

fn run_loop<F>(mut handler: F)
where F: 'static + FnMut() {
for _ in 0..500 {
handler();
}
}

fn main() {
let nodes = vec![
Node {
value: 1,
children: vec![
Node { value: 3, children: vec![] }
],
},
Node {
value: 2,
children: vec![],
},
];
let mut node = &nodes[0];

run_loop(move || {
println!("Node: {:?}", node);
node = &node.children[0];
});
}
Rust Playground
使这项工作最好的方法是什么?我无法更改 run_loop的结构。理想情况下,我不会更改 Node的结构(它是从第三方库返回的对象,因此尽管我可以将该对象解析为新的数据结构,但这并不好用)。我可以仅通过更改 main来使借阅检查器满意吗?

最佳答案

it complains that nodes doesn't live long enough.


那是因为事实并非如此。 run_loop函数要求其参数永久存在( 'static)。 nodes变量不会永远存在,因此捕获它的闭包也不会永远存在。
简单的解决方法是将 run_loop更改为不需要永久存在的参数(通过删除 'static约束),但是如果您不能这样做,则可以使 nodes永久存在。您可以通过“泄漏”它来实现。
let nodes = vec![ /*...*/ ];
let nodes = Vec::leak(nodes);
let mut node = &nodes[0];
( Playground link)
目前,这需要每晚进行一次,但Box中的稳定泄漏功能类似。
let nodes = vec![ /*...*/ ];
let nodes = Box::leak(nodes.into_boxed_slice());
let mut node = &nodes[0];
( Playground link)

关于rust - Rust-无法借用对捕获树中结构的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63192441/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com