我正在尝试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"));
但是我认为如果删除句柄,我可以访问像这样的hash元素:
$self->options->set("step1", "Step 1");
printf ("Get option %s\n", $self->options->get("step1"));
我需要在同一个类中具有多个哈希,如何使用访问器访问每个哈希,例如:
$self->hash1->get("key1");
$self->hash2->get("key1");
最佳答案
不,你不能做:
$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一样获取和设置 key :
$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"));
然后,解决方案是上述自动框,或者不使用hashrefs,而是使用提供
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"));
关于Perl麋哈希访问器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22120009/