首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl Moose Hash访问器

Perl Moose Hash访问器
EN

Stack Overflow用户
提问于 2014-03-01 20:34:54
回答 1查看 2.3K关注 0票数 5

我正在尝试驼鹿的例子:

代码语言:javascript
复制
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',
      },
  );

我发现它是这样工作的:

代码语言:javascript
复制
$self->set_option("step1", "Step 1");
printf ("Get option %s\n", $self->get_option("step1"));

但我想,如果删除句柄,就可以访问散列元素,如下所示:

代码语言:javascript
复制
$self->options->set("step1", "Step 1");
printf ("Get option %s\n", $self->options->get("step1"));

我需要在同一个类中有许多散列,如何使用访问器访问每个散列,如:

代码语言:javascript
复制
$self->hash1->get("key1");
$self->hash2->get("key1");
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-01 22:20:17

不,你不能:

代码语言:javascript
复制
$self->options->set("step1", "Step 1");
printf ("Get option %s\n", $self->options->get("step1"));

..。因为$self->options只返回一个普通的hashref,而不是一个对象。不能在普通的hashref上调用方法。(嗯,总是有自动驾驶箱的。)

但是,仅仅因为您使用的是Moose,不要忘记您也在使用Perl。在Perl中,您不需要方法来访问hashref。是哈希瑞夫。您可以像其他任何hashref一样获取和设置键:

代码语言:javascript
复制
$self->options->{"step1"} = "Step 1";
printf ("Get option %s\n", $self->options->{"step1"});

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

代码语言:javascript
复制
$self->options->set("step1", "Step 1");
printf ("Get option %s\n", $self->options->get("step1"));

然后,解决方案是前面提到的自动盒,或者不使用hashrefs,而是使用提供get/set方法的对象。例如,*对象::WithUtils。下面是一个简单的例子:

代码语言:javascript
复制
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"));
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22120009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档