加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

现代Perl:如何在AUTOLOAD()中实现Redispatching方法?

发布时间:2020-12-15 23:26:39 所属栏目:大数据 来源:网络整理
导读:在OO主题中感觉很弱我试着用 Modern Perl book进行改进.关于我在以下示例中找到的问题: package Proxy::Log; sub new{ my ($class,$proxied) = @_; bless $class,$proxied;}sub AUTOLOAD{ my ($name) = our $AUTOLOAD =~ /::(w+)$/; Log::method_call( $n
在OO主题中感觉很弱我试着用 Modern Perl book进行改进.关于我在以下示例中找到的问题:

package Proxy::Log; 

sub new
{
    my ($class,$proxied) = @_;
    bless $class,$proxied;
}

sub AUTOLOAD
{
    my ($name) = our $AUTOLOAD =~ /::(w+)$/;
    Log::method_call( $name,@_ );
    my $self = shift;
    return $$self->$name( @_ );
}

这段代码只是一个划痕或工作示例吗?

我不明白,我怎么能用它,它应该记录在哪里和什么,以及我应该如何创建一个对象(什么应该到$proxied)?

我添加了几行来测试它,但没有得到AUTOLOAD功能:

package main;

my $tst = Proxy::Log->new();
say $tst->AnyKindOfSub();

我希望你能引导我使用它的一些工作代码.我知道我的想法,关闭和AUTOLOAD如何工作,但我在这里有点卡住.

解决方法

我认为这个例子已经在新的Proxy :: Log中切换了bless参数.它可能应该是:

bless $proxied,$class;

在下面找到一个功能性示例,因为它可能是预期的.代理类写入日志,然后重新调度对目标对象的调用(下面的示例中的另一个类).

package Proxy::Log;

sub new {
    my ($class,$proxied) = @_;
    bless $proxied,$class;
}

sub AUTOLOAD {
    my ($name) = our $AUTOLOAD =~ /::(w+)$/;
    warn "$name: @_";
    my $self = shift;
    return $$self->$name( @_ );
}

package Another;

sub new { 
    bless {},$_[0];
} 

sub AnyKindOfSub {
    warn "Target calledn";
    return "Hello";
};


package main;

my $tst = Proxy::Log->new(Another->new);
say $tst->AnyKindOfSub();

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读