我正在尝试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',
},
);
Run Code Online (Sandbox Code Playgroud)
我发现它的工作原理如下:
$self->set_option("step1", "Step 1");
printf ("Get option %s\n", $self->get_option("step1"));
Run Code Online (Sandbox Code Playgroud)
但我想如果我删除句柄,我可以像这样访问哈希元素:
$self->options->set("step1", "Step 1");
printf ("Get option %s\n", $self->options->get("step1"));
Run Code Online (Sandbox Code Playgroud)
我需要在同一个类中有许多哈希,如何使用访问器访问每个哈希:
$self->hash1->get("key1");
$self->hash2->get("key1");
Run Code Online (Sandbox Code Playgroud)
tob*_*ink 11
不,你做不到:
$self->options->set("step1", "Step 1");
printf ("Get option %s\n", $self->options->get("step1"));
Run Code Online (Sandbox Code Playgroud)
...因为$self->options只返回一个普通的hashref,而不是一个对象.您不能在普通的hashref上调用方法.(好吧,总是有自动装置.)
但仅仅因为你正在使用Moose,不要忘记你也在使用Perl.而在Perl你没有需要的方法来访问hashref.这是一个hashref.您可以像任何其他hashref一样获取和设置键:
$self->options->{"step1"} = "Step 1";
printf ("Get option %s\n", $self->options->{"step1"});
Run Code Online (Sandbox Code Playgroud)
如果你真的,真的很喜欢这种语法:
$self->options->set("step1", "Step 1");
printf ("Get option %s\n", $self->options->get("step1"));
Run Code Online (Sandbox Code Playgroud)
然后解决方案是前面提到的autobox,或者不使用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"));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1741 次 |
| 最近记录: |