gpt4 book ai didi

closures - 将 spawn 的调用者与 spawned 过程分离的最佳方法是什么?

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

使用rust 0.12。

假设我有一个可发送的闭包,它的定义完全独立于应该在另一个任务中生成它的代码。

关闭类型:

type closure_type = ||: 'static + Send;

代码:

let do_stuff : closure_type = || println!("stuff"); // "uknown" procedure
let outer_fun = || {
spawn(proc() {
do_stuff();
});
};
outer_fun(); // someone else calls this

上面的例子编译失败,并在“proc()”范围内显示一条消息“无法移出捕获的外部变量”。为什么 outer_fun 捕获 do_stuff 变量(如果它未在那里使用)?

稍微修改后,我发现一种可能的解决方案是将 do_stuff 函数显式传递给 outer_fun 闭包(此编译):

let do_stuff : closure_type = || println!("stuff");
let outer_fun = | do_do_stuff: closure_type | {
spawn(proc() {
do_do_stuff();
});
};
outer_fun(do_stuff); // I don't want someone else to know about "do_stuff"!

但这关闭了其他人在不知道生成什么的情况下调用生成的可能性。

显然,我的大脑可能会因为无限制地使用 Javascript 而受到一些损伤,所以我必须谦虚地问:在 Rust 中完成这样的事情的正确方法是什么?

更新:只需在主回调上生成一个过程!呸。

let do_stuff = || spawn(proc() println!("Hello"));
let do_spawn = || {
do_stuff();
};
for i in range(1u, 10) {
do_spawn(); // Even multiple times.
}

最佳答案

Why does the outer_fun captures do_stuff variable if it is not used there?

但它在那里使用! do_stuff出现在闭包体内,闭包是词法的,所以do_stuff必然被outer_fun捕获。

目前闭包通过引用捕获每个变量。这很有用,因为它允许您改变“外部”变量,就好像闭包主体直接嵌入到外部代码中一样。但是,这确实会阻止您移出捕获的变量(因为这意味着移出引用)。

另一方面,

proc() 的环境在堆上,并且只能调用一次。这意味着他们每个捕获的值(value)转移到他们的环境中。但是,您正在尝试在 proc() 体内使用 do_stuff (由 outer_fun 闭包捕获),这是通过引用捕获的并且无法移入 proc(),因此这是您的错误。

我认为还不可能做您想做的事。目前有一个 accepted unboxed closures提议。适当的拆箱关闭将很快实现;特别是未装箱的闭包可以通过值捕获它们的环境,就像 proc() 一样(它将被显式装箱的未装箱闭包取代 [没有双关语意])。据我所知,当未装箱的闭包落地时,您将能够完全按原样编译您的第一个示例(只需将 proc() 更改为 box || 或东西)。

关于closures - 将 spawn 的调用者与 spawned 过程分离的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25233680/

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