我尝试通过前向声明子例程来隐藏基类中的方法,例如:
sub xid;
如果我调用这个方法,我会得到预期的错误:
DBG> $tuple->xid
ERROR: Undefined subroutine &HyperMouse::Schema::Result::SaldoAnal::xid called at (eval 2346)[/home/kes/perl5/perlbrew/perls/perl-5.24.1/lib/site_perl/5.24.1/DB/Hooks.pm:422] line 8, <STDIN> line 13.
但是 $tuple->can( 'xid' )
仍然返回真值:
&HyperMouse::Schema::Result::SaldoAnal::xid
如何隐藏 xid
方法,让 $tuple->can( 'xid' )
返回 false 而不是:
&HyperMouse::Schema::Result::SaldoAnal::xid
最佳答案
你可以覆盖可以
。
隐藏所有现有但未定义的子项:
sub can {
my $self = shift;
my $cv = $self->SUPER::can(@_)
or return undef;
defined(&$cv)
or return undef;
return $cv;
}
隐藏特定的子:
sub can {
my $self = shift;
my $cv = $self->SUPER::can(@_)
or return undef;
$cv == \&xid
and return undef;
return $cv;
}
您隐藏基类方法的整个尝试是一件非常奇怪的事情。导致调用失败也就不足为奇了。
sub xid {
croak("Not supported.");
}
但这并不能真正掩盖糟糕的类设计的恶臭。
无论您使用哪种 hack,都可以完全绕过
$tuple->Base::Class::xid()
关于perl - 如何以 `can`看不到的方式隐藏基类中的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63179634/