所以我熟悉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; }
解决方法
如果您正在使用Perl 5.10及更高版本(实际上是5.9及更高版本,但我不计算开发版本),则字段会创建受限制的哈希.有关限制哈希的信息,请参阅
Hash::Util.
要使所有字段都可用于受限制的哈希,请使用legal_keys或legal_ref_keys函数:
use Hash::Util qw( legal_ref_keys ); my $froot = Fruit->new(); my @attribs = legal_ref_keys($froot);
>在构造期间创建一个临时对象并查询合法密钥,以便您可以创建属性— UGLY
> AUTOLOAD属性通过查询对象以获取合法密钥列表. CODE SMELL ALERT:这假定所有子类将使用相同的底层数据结构.
>访问模块中的%FIELDS哈希,以便在编译时或通过AUTOLOAD生成方法.更多问题 – 假设未发布的一些字段pragma将保留.
>在编译时定义属性数组并自动生成方法并根据值设置字段.
>放弃编写所有这些样板并使用Moose.
选项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',); has 'taste' => ( is => 'rw',);