gpt4 book ai didi

rust - 两个使用对父作用域的引用的闭包

转载 作者:行者123 更新时间:2023-11-29 08:26:11 27 4
gpt4 key购买 nike

我试图创建一个存储 2 个闭包的结构,每个闭包都具有对创建它们的父作用域变量的读取引用。

在我关闭了父作用域中的引用之后,我如何确保它们与闭包存在相同的时间?

例如:

struct S {
x: bool,
}

type Closure = Box<dyn Fn()>;

struct Env {
fn_a: Closure,
fn_b: Closure,
}

fn get_env() -> Env {
let s = S { x: true };

let fn_a = || {
&s.x;
};
let fn_b = || {
&s.x;
};

Env {
fn_a: Box::new(fn_a),
fn_b: Box::new(fn_b),
}
}

fn main() {
let env = get_env();
}

playground

结果:

error[E0597]: `s` does not live long enough
--> src/main.rs:16:10
|
15 | let fn_a = || {
| -- value captured here
16 | &s.x;
| ^ borrowed value does not live long enough
...
23 | fn_a: Box::new(fn_a),
| -------------- cast requires that `s` is borrowed for `'static`
...
26 | }
| - `s` dropped here while still borrowed```

最佳答案

这取决于你的场景。返回的闭包会存在多久?

如果它的生命周期与 Env 一样长值(value),搬家怎么样s进入Env值和访问 s来自 Env值(value)?

如果您不知道(或者不想费心去弄清楚)闭包的生命周期,一个方便(虽然效率稍低)的方法是使用 Rc , 然后 move结果中 Rc 的克隆:

Playground

use std::rc::Rc;

pub struct S {
x: bool,
}

pub type Closure = Box<dyn Fn()>;

#[allow(unused)]
pub struct Env {
fn_a: Closure,
fn_b: Closure,
}

fn get_env() -> Env {
let s = Rc::new(S { x: true });

let cloned = Rc::clone(&s);
let fn_a = move || {
s.x;
};
let fn_b = move || {
cloned.x;
};

Env {
fn_a: Box::new(fn_a),
fn_b: Box::new(fn_b),
}
}

fn main() {
let _env = get_env();
}

关于rust - 两个使用对父作用域的引用的闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57677280/

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