Perl 当方法为CODEREF时,继承如何工作?
在下一行代码中:Perl 当方法为CODEREF时,继承如何工作?,perl,mojolicious,Perl,Mojolicious,在下一行代码中: for my $cb (@$s) { $self->$cb(@_) } 其中,$cb是回调的CODEREF 如果我写下以下内容,会有什么不同吗 for my $cb (@$s) { $cb->($self, @_) } 我假设继承将不起作用,因为$cb是CODEREF,因为它在$cb包含带有方法名称的字符串时起作用。 所以在这种情况下,重写的代码也会起到类似的作用 我是否理解正确或遗漏了一些内容?当$cb是代码引用时,不会检查继承。事实上,$self根本没有被检
for my $cb (@$s) { $self->$cb(@_) }
其中,$cb
是回调的CODEREF
如果我写下以下内容,会有什么不同吗
for my $cb (@$s) { $cb->($self, @_) }
我假设继承将不起作用,因为$cb
是CODEREF
,因为它在$cb
包含带有方法名称的字符串时起作用。
所以在这种情况下,重写的代码也会起到类似的作用
我是否理解正确或遗漏了一些内容?当
$cb
是代码引用时,不会检查继承。事实上,$self
根本没有被检查
当
$cb
是代码引用时
$self->$cb(@_)
在功能上与相同
$cb->($self, @_)
这就是为什么$cb
应该使用继承之后的can
来获取
package Parent {
sub new { bless({ @_ }, shift) }
sub method { CORE::say("!"); }
}
package Child {
our @ISA = 'Parent';
}
my $self = Child->new();
my $method_name = 'method';
my $cb = $self->can($method_name)
or die("The object's class doesn't have method $method_name\n");
$self->$cb();
请注意,有些人使用
my $f = "function_name";
undef->$f();
作为替代
my $f = "sub_name";
no strict qw( refs );
$f->();
然而,使用方法调用来调用非方法是非常不合适的,并且这种技巧只有在子方法没有参数时才有效。如果您在使用no strict
这一(适当的)用法时确实有问题,您可以使用以下()技巧:
但是当
$cb
是string还是CODEREF时会有区别吗?当$cb
是string时会使用继承。您可以添加$self::$cb()
场景的描述吗?这是无效的Perl。(Scalar在-e行1,靠近“$self::$cb”(在$cb之前缺少运算符?
)的位置找到运算符。我不明白为什么您的详细答案被否决了(($cb
之后缺少箭头运算符)。$cb
。它应该是$cb->($self,@)
@HåkonHægland是的——如果$cb
确实是一个coderef,我在源代码中不清楚什么。@zdim OP说它是一个coderef
。所以我信任他。@HåkonHægland是的,当然是的——只是想补充这个语句,因为它有很大的不同。perl-E'my$f=sub{说“foo”};undef->$f()
my $f = "sub_name";
(\&$f)->(); # \&$f isn't subject to "use strict qw( refs );" checks