gpt4 book ai didi

perl - 如何以 `can`看不到的方式隐藏基类中的方法?

转载 作者:行者123 更新时间:2023-12-03 23:34:07 25 4
gpt4 key购买 nike

我尝试通过前向声明子例程来隐藏基类中的方法,例如:

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/

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