gpt4 book ai didi

perl - &$func($arg) 和 $func->($arg) 之间有什么区别吗?

转载 作者:行者123 更新时间:2023-12-04 22:12:48 33 4
gpt4 key购买 nike

在尝试理解闭包时,通过阅读 perl-faq 中的 perlrefcoderef 找到了这些示例:

sub add_function_generator {
return sub { shift() + shift() };
}
my $add_sub = add_function_generator();
my $sum = $add_sub->(4,5);


sub newprint {
my $x = shift;
return sub { my $y = shift; print "$x, $y!\n"; };
}
$h = newprint("Howdy");
&$h("world");

这是调用存储在变量中的函数的两种形式。
&$func($arg)
$func->($arg)

这些是完全相同的(仅在语法上不同)还是存在一些差异?

最佳答案

没有区别。证明:每个版本生成的操作码:

$ perl -MO=Concise -e'my $func; $func->()'
8 <@> leave[1 ref] vKP/REFC ->(end)
1 <0> enter ->2
2 <;> nextstate(main 1 -e:1) v:{ ->3
3 <0> padsv[$func:1,2] vM/LVINTRO ->4
4 <;> nextstate(main 2 -e:1) v:{ ->5
7 <1> entersub[t2] vKS/TARG ->8
- <1> ex-list K ->7
5 <0> pushmark s ->6
- <1> ex-rv2cv K ->-
6 <0> padsv[$func:1,2] s ->7
$ perl -MO=Concise -e'my $func; &$func()'
8 <@> leave[1 ref] vKP/REFC ->(end)
1 <0> enter ->2
2 <;> nextstate(main 1 -e:1) v:{ ->3
3 <0> padsv[$func:1,2] vM/LVINTRO ->4
4 <;> nextstate(main 2 -e:1) v:{ ->5
7 <1> entersub[t2] vKS/TARG ->8
- <1> ex-list K ->7
5 <0> pushmark s ->6
- <1> ex-rv2cv sKPRMS/4 ->-
6 <0> padsv[$func:1,2] s ->7

...等等, - <1> ex-rv2cv sKPRMS/4 ->- 的标志实际上有细微的不同。无论如何,它们似乎无关紧要,并且两种形式的行为都相同。

但我建议使用 $func->() 形式:我认为这种语法更优雅,你不会不小心忘记使用括号( &$func 工作但使当前 @_ 对函数可见,这不是你通常想要的)。

关于perl - &$func($arg) 和 $func->($arg) 之间有什么区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21074085/

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