Perl Moose哈希访问器

5

我正在尝试Moose的示例:

has 'options' => (
      traits    => ['Hash'],
      is        => 'rw',
      isa       => 'HashRef[Str]',
      default   => sub { {} },
      handles   => {
          set_option     => 'set',
          get_option     => 'get',
          has_no_options => 'is_empty',
          num_options    => 'count',
          delete_option  => 'delete',
          option_pairs   => 'kv',
      },
  );

我发现它的工作原理如下:

$self->set_option("step1", "Step 1");
printf ("Get option %s\n", $self->get_option("step1"));

但我认为如果去掉句柄,我可以像这样访问哈希元素:

$self->options->set("step1", "Step 1");
printf ("Get option %s\n", $self->options->get("step1"));

我需要在同一个类中有多个哈希表,如何使用访问器访问每个哈希表,例如:

$self->hash1->get("key1");
$self->hash2->get("key1");
1个回答

11

不行,你不能这样做:

$self->options->set("step1", "Step 1");
printf ("Get option %s\n", $self->options->get("step1"));

......因为$self->options只返回一个普通的hashref,而不是一个对象。你不能在一个普通的hashref上调用方法。(好吧,总有autobox)。

但是仅仅因为你使用了Moose,并不要忘记你同时也在使用Perl。在Perl中,你不需要方法来访问一个hashref。它就是一个hashref。你可以像任何其他hashref一样获取和设置键:

$self->options->{"step1"} = "Step 1";
printf ("Get option %s\n", $self->options->{"step1"});

如果你真的、真的喜欢这个语法:

$self->options->set("step1", "Step 1");
printf ("Get option %s\n", $self->options->get("step1"));

那么解决方案就是前面提到的自动盒装(autobox),或者不使用哈希引用,而是使用具有get/set方法的对象。例如List::Objects::WithUtils。下面是一个快速示例:

use v5.10;
use strict;
use warnings;

{
   package Foo;

   use Moose;
   use List::Objects::Types qw( HashObj );

   has options => (
      is      => 'ro',
      isa     => HashObj,
      coerce  => 1,
      default => sub { {} },
   );
}

my $obj = Foo->new;

$obj->options->set("step1", "Step 1");
printf("Get option %s\n", $obj->options->get("step1"));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接