如果是perl,则代码引用中的变量范围需要解释奇怪的行为

蒂马

为什么@coderefs中的coderef返回的$ 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的值,我们将看到它们具有相同的值,就好像$ copy_of_i不是每个新创建的coderef的本地值一样。为什么?

mpapec

您希望具有与闭包关联的不同值,但是$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;
    };
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

需要解释C ++代码的行为

来自分类Dev

这种奇怪的多态行为需要解释

来自分类Dev

C ++中奇怪的引用行为

来自分类Dev

PyDict_SetItem是否增加键的引用计数,如果是,则在代码中的何处发生?

来自分类Dev

Elasticsearch中范围查询的奇怪行为

来自分类Dev

如果是其他行为

来自分类Dev

引用未知范围数组的不同编译器的奇怪行为

来自分类Dev

Perl中数组声明的奇怪行为

来自分类Dev

Perl json编码中的奇怪行为

来自分类Dev

简单 Delphi 代码中的奇怪行为

来自分类Dev

href属性中jQuery代码的奇怪行为

来自分类Dev

引用样式语言“如果是”

来自分类Dev

Android SharedPreferences中奇怪的无法解释的行为

来自分类Dev

在LowerCamelCase中命名变量时的奇怪行为

来自分类Dev

Ruby中奇怪的局部变量行为

来自分类Dev

JavaScript中名为“状态”的变量的奇怪行为

来自分类Dev

JavaScript中名为“状态”的变量的奇怪行为

来自分类Dev

奇怪的范围行为

来自分类Dev

奇怪的行为,通过引用分配未定义的变量

来自分类Dev

数组引用的奇怪行为

来自分类Dev

请在PERL代码中解释while循环?

来自分类Dev

Perl拆分奇怪的行为

来自分类Dev

Perl:chomp 的奇怪行为

来自分类Dev

在Spring MVC中,使用会话范围的bean完成操作后,是否需要解除绑定到该会话的bean对象的绑定?如果是,怎么办?

来自分类Dev

python代码中的变量范围

来自分类Dev

奇怪的并发代码行为

来自分类Dev

奇怪的行为java变量

来自分类Dev

涉及变量的奇怪行为

来自分类Dev

Makefile 奇怪的变量行为