因此,我熟悉Perl中的fields pragma,可用于限制存储在类中的字段:
package Fruit;
use fields qw( color shape taste );
sub new {
my ( $class, $params ) = @_;
my $self = fields::new( $class ) unless ref $class;
foreach my $name ( keys %$params ) {
$self->{ $name } = $params->{ $name };
}
return $self;
}
在顶部声明了字段之后,如何返回列表,比如说我想动态生成访问器?
keys %FIELDS
是唯一的方法吗?其次,有没有比我上面做的遍历和分配每个参数更有效的方法来预填充构造函数中的字段?
最佳答案
如果您使用的是Perl 5.10及更高版本(实际上是5.9及更高版本,但我不包括开发版本),则fields
将创建一个受限制的哈希值。有关受限散列的信息,请参见Hash::Util。
要获取可用于受限哈希的所有字段,请使用legal_keys
或legal_ref_keys
函数:
use Hash::Util qw( legal_ref_keys );
my $froot = Fruit->new();
my @attribs = legal_ref_keys($froot);
您可以做很多事情来自动生成您的方法:
%FIELDS
哈希值,以在编译时或通过AUTOLOAD生成方法。 更多问题-假定将保留fields
杂语的未发布位。 选项4:
package Fruit;
use strict;
use warnings;
my @ATTRIBUTES;
BEGIN { @ATTRIBUTES = qw( color shape taste ); }
use fields @ATTRIBUTES;
for my $attrib ( @ATTRIBUTES ) {
my $getset = sub {
my $self = shift;
if( @_ ) {
$self->{$attrib} = shift;
}
return $self->{$attrib};
};
{ no strict 'refs';
*{$attrib} = $getset;
}
}
sub new {
my ( $class, $params ) = @_;
my $self = fields::new( $class ) unless ref $class;
foreach my $name ( keys %$params ) {
$self->{ $name } = $params->{ $name };
}
return $self;
}
选项5。
package Fruit;
use Moose;
has 'color' => (
is => 'rw',
isa => 'Str',
);
has 'shape' => (
is => 'rw',
isa => 'Str',
);
has 'taste' => (
is => 'rw',
isa => 'Str',
);
关于perl - 从 'use fields'编译指示中获取字段列表?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2550386/