gpt4 book ai didi

perl - coderefs 中的变量范围如果 perl,需要解释奇怪的行为

转载 作者:行者123 更新时间:2023-12-01 00:56:07 25 4
gpt4 key购买 nike

为什么@coderefs 中coderefs 返回的$copy_of_i 的值是一样的?

use Modern::Perl;
my @coderefs = ();
for (my $i = 0; $i < 5; $i++){
push @coderefs, sub {
my $copy_of_i = $i;
return $copy_of_i;
};
}

say $coderefs[1]->();
say $coderefs[3]->();

我认为 $copy_of_i 对于添加到 @coderefs 的每个 coderef 都是本地的,因此包含在循环的给定迭代中分配给 $copy_of_i 的 $i 的当前值。但是,如果我们用 'say' 显示几个 $copi_of_i 的值,我们将看到它们具有相同的值,就好像每个新创建的 coderef 的 $copy_of_i 都不是本地的一样。为什么?

最佳答案

您想要与闭包关联的不同值,但您只有一个变量 $i对于所有要捕获的闭包。您需要为每个要捕获的闭包创建一个变量,因此 $copy_of_i应该在闭包之外创建。在调用闭包时创建副本为时已晚; $i不再包含该点所需的值。

for (my $i = 0; $i < 5; $i++){
my $copy_of_i = $i;
push @coderefs, sub {
return $copy_of_i;
};
}

顺便说一句, for my $i (0 .. 5)优于 for (my $i = 0; $i < 5; $i++) ,并且它的优点是为循环的每次迭代创建一个新变量,因此您可以简单地使用
my @coderefs;
for my $i (0 .. 4) {
push @coderefs, sub {
return $i;
};
}

关于perl - coderefs 中的变量范围如果 perl,需要解释奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27818725/

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