Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 当方法为CODEREF时,继承如何工作?_Perl_Mojolicious - Fatal编程技术网

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