因此,我熟悉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_keyslegal_ref_keys函数:

use Hash::Util qw( legal_ref_keys );

my $froot = Fruit->new();
my @attribs = legal_ref_keys($froot);

您可以做很多事情来自动生成您的方法:
  • 在构造过程中创建一个临时对象并向其查询合法 key ,以便您可以创建属性--- UGLY
  • 通过查询对象的合法 key 列表,获取
  • AUTOLOAD属性。 代码提示:假定所有子类都将使用相同的基础数据结构。
  • 访问模块中的%FIELDS哈希值,以在编译时或通过AUTOLOAD生成方法。 更多问题-假定将保留fields杂语的未发布位。
  • 在编译时定义属性数组,并自动生成方法,并根据该值设置字段。
  • 放弃编写所有样板并使用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',
        isa => 'Str',
    );
    
    has 'taste' => (
        is => 'rw',
        isa => 'Str',
    );
    

    关于perl - 从 'use fields'编译指示中获取字段列表?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2550386/

    10-14 04:58