【问题标题】:How to merge HashRef in Moose attribute writer?如何在 Moose 属性编写器中合并 HashRef?
【发布时间】:2013-12-11 11:32:41
【问题描述】:

有一个简单的示例代码

use Modern::Perl;
use Data::Dumper;

package My;
use Moose;
use Method::Signatures::Simple;
has 'result' => (
    is => 'rw',
    isa => 'HashRef',
    default => sub{{}},
    clearer => 'clear_result'
);

method run {
    $self->clear_result;                 #clearing the result
    $self->result( $self->run_part1 );
    $self->do_something;
    $self->result( $self->run_part3 );   #need merge
}

method do_something {
    $self->result( $self->run_part2 );   #need merge
}

method run_part1 { return { aaa => 'aaa' } }
method run_part2 { return { bbb => 'bbb' } }
method run_part3 { return { ccc => 'ccc' } }

package main;
my $p = My->new;
say Dumper $p->run;

结果(当然)是:

$VAR1 = {
          'ccc' => 'ccc'
        };

我想要结果:

$VAR1 = {
          'aaa' => 'aaa'
          'bbb' => 'bbb'
          'ccc' => 'ccc'
        };

那么,问题是——设置时如何合并$self->resultHashRef?

是的,我可以添加新方法add_result,例如:

method add_result($hr) {
    use Hash::Merge::Simple qw(merge);
    $self->result( merge $self->result, $hr );
}

并且在我的代码中将$self->result 更改为$self->add_result,但想知道是否还有其他解决方案...

【问题讨论】:

    标签: perl moose


    【解决方案1】:
    has 'result' => (
        acccessor => '_result',
        isa => 'HashRef',
        default => sub{{}},
        clearer => 'clear_result'
    );
    
    sub result {
        my $self = shift;
        if (@_) {
            my ($hr) = @_;
            return $self->_result( ... merged hash ...);
        } else {
            return $self->_result();
        }   
    }
    

    【讨论】:

    • 如果您想在has 中定义访问者,也可以使用handles => { result => sub { ... } }
    猜你喜欢
    • 2013-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-31
    • 1970-01-01
    • 2019-10-22
    • 1970-01-01
    • 2014-10-20
    相关资源
    最近更新 更多