gpt4 book ai didi

perl oo 动态方法

转载 作者:行者123 更新时间:2023-12-05 04:18:17 26 4
gpt4 key购买 nike

我想在类中动态定义方法。我正在写一个跟踪器,比下面的框架稍微复杂一些,它也有状态意识,但这与我的问题无关。我写了一个 TraceSlave 类,它带有调用 sprintf 的跟踪方法,用文本\n 替换换行符,一切都很好。

基本上我想将我的跟踪实例化为:

my @classes = qw(debug token line src match);
my $trace = Tracer->new(\@classes);

我应该能够调用跟踪的动态定义方法:

$trace->debug("hello, world");
$trace->match("matched (%s)(%s)(%s)(%s)(%s)", $1, $2, $3, $4, $5);

所以我的 Tracer 类看起来像:

package Tracer;
sub new {
my $class = shift;
my $self = {};
my @traceClasses = @{$_[0]};
bless $self, $class;
for (@traceClasses) {
# This next line is wrong, and the core of my question
$self->$_ = new TraceSlave($_, ...)->trace
} # for (@traceClasses)
}

它不会,因为它无法编译。基本上我想定义 Tracer 实例的方法,作为 TraceSlave 实例的跟踪方法;在一个循环中。

我可以使用 AUTOLOAD 或 eval 来完成,但那是错误的。什么是正确的方法?

为了完整起见,这里是 TraceSlave。没关系

package TraceSlave;
sub new {
my $self = { header => $_[1], states => $_[2], stateRef => $_[3] };
bless $self, $_[0];
return $self;
} # new()

sub trace {
my $self = shift;
my @states = @{$self->{states}};
if ($states[${$self->{stateRef}}]) { # if trace enabled for this class and state
my @args;
for (1..$#_) { ($args[$_-1] = $_[$_]) =~ s/\n/\\n/g; } # Build args for sprintf, and replace \n in args
print $self->{header}.sprintf($_[0], @args)."\n";
}
} # trace()

最佳答案

每当我开始运行时修改类时,我就开始使用 MOP 和 Moose。所以如果我没看错的话,你想要的是

package Tracer;
use strict;
use warnings;
use Moose;
use TraceSlave;

has 'classes' => ( is => 'ro', isa => 'ArrayRef[Str]', required => 1 );

### This is to allow ->new(\@classes) invocation instead of just
### using ->new( classes => \@classes) for invocation
around BUILDARGS => sub {
my $orig = shift;
my $class = shift;

if ( @_ == 1 && ref $_[0] eq 'ARRAY' ) {
return $class->$orig( classes => $_[0] );
}
else {
return $class->$orig(@_);
}
};

sub BUILD {
my $self = shift;
for my $class (@{$self->classes}) {
my $tracer = TraceSlave->new($class, ...);
$self->meta->add_method( $class => sub { $tracer->trace(@_) } );
}
}

虽然我相当确定这只是在引擎盖下做同样的事情并最终成为一个字符串评估。我根本没有深入研究 MOP 的内部结构。 (我也不是 100% 确定这是正确的代码或使用 Moose 做事的最佳方式,所以买家要当心。:))

关于perl oo 动态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16959707/

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