當$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
一個問題,您可以在以下的(documented)絕招:
my $f = "sub_name";
(\&$f)->(); # \&$f isn't subject to "use strict qw(refs);" checks
存在丟失的箭頭操作符' - >''$ cb'後。它應該是'$ cb - >($ self,@_)' –
@HåkonHægland正確的 - 如果'$ cb'確實是一個coderef,那麼在源代碼中我就不清楚了。 – zdim
@zdim OP說它是'CODEREF'。所以我信任他。 –