gpt4 book ai didi

Perl Moose 哈希访问器(accessor)

转载 作者:行者123 更新时间:2023-12-04 22:31:25 26 4
gpt4 key购买 nike

我正在尝试 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");

最佳答案

不,你不能这样做:

$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 一样获取和设置键:
$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 Moose 哈希访问器(accessor),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22120009/

26 4 0
文章推荐: angularjs - 在 AngularJS 中,有没有办法用范围值设置