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

perl – 从’use fields’pragma获取字段列表?

发布时间:2020-12-15 22:06:16 所属栏目:大数据 来源:网络整理
导读:所以我熟悉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 )
所以我熟悉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;
}

一旦我在顶部声明了字段,我怎么能回到列表,说因为我想动态生成访问器?键%FIELDS是唯一的方法吗?

其次,是否有一种更有效的方法来预先填充构造函数中的字段,而不是像上面那样循环并分配每个参数?

解决方法

如果您正在使用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',);

(编辑:李大同)

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

    推荐文章
      热点阅读