借用JavaScript这个术语,在Perl中实现IIFE的“最佳实践”方式是什么?
我下面的测试代码是一个简单的循环,调用匿名sub并立即执行它以构建一个sub数组(它只返回循环索引)。这是我想要的,但是我需要使用一个中间变量(而不是使用@_,它会在内部函数中发生变化)。
use warnings;
use strict;
my @funcs;
for(my $i=0;$i<3;$i++) {
sub {
my $index=shift;
$funcs[$index]=sub {$index};
}
-> ($i);
}
for (@funcs) {
print &$_()."\n";
}
#Output
0
1
2
我知道我可以使用map
来重构这个问题。但撇开这一点,有没有更好的方法呢?
更新
感谢@ikegami强调了一些重要的观点。
只是对于这个问题的未来看法,我对此的看法:
'迭代器' for循环具有不同的作用域(它是Map吗?)而不是“c样式”for循环。这样就可以清理代码而不需要IIFE。太好了
更新2
下面的代码显示了我看到的差异。不是说一个比另一个好,但很高兴知道我认为。我所追求的输出是0 1 2,但第一个只重复$i的最后一个值(++运算符后的3)。
use warnings;
use strict;
my @funcs;
print "C loop direct assignment of sub\n";
for(my $i=0;$i<3;$i++) {
$funcs[$i]= sub {$i};
}
print &$_()."\n" for @funcs;
print "C loop direct assignment of sub with variable\n";
for(my $i=0;$i<3;$i++) {
my $index=$i; #assignment/copy
$funcs[$index]= sub {$index};
}
print &$_()."\n" for @funcs;
print "For loop interator\n";
@funcs=[];
for my $i (0..2) {
$funcs[$i]=sub {$i};
}
print &$_()."\n" for @funcs;
print "C loop with IIFE assignment\n";
@funcs=[];
for (my $i=0;$i<3;$i++) {
sub {
my $index=shift;
$funcs[$index]=sub {$index};
}
-> ($i);
}
print &$_()."\n" for @funcs;
Out是:
C loop direct assignment of sub
3
3
3
C loop direct assignment of sub with variable
0
1
2
For loop interator
0
1
2
C loop with IIFE assignment
0
1
2
1条答案
按热度按时间vfwfrxfs1#
的Perl等价物
是
也就是说,IIFE只是Perl中根本不需要的一种解决方法。
是一种解决方法
和/或
是一个解决方案
看起来你正在尝试翻译类似于以下内容的内容:
以下是直译:
但使用IIFE根本没有意义。可以简单地使用以下内容:
现在,人们倾向于避免在Perl中使用C风格的for循环,因为使用foreach循环的可读性更好(也更高效!)。它还使解决方案更加简单,因为foreach循环的循环变量的作用域是循环体,而不是循环语句。
我们也可以使用
map
。