【问题标题】:How can I construct a moose object from a hash generated from one of the attributes?如何从其中一个属性生成的哈希中构造 moose 对象?
【发布时间】:2023-03-31 00:55:01
【问题描述】:

我有几个包:

package FOO;
use Moose;
has 'obj' => (is=>'ro');
sub hash { 
    my $self = shift;
    return $self->make_hash($self->obj}; 
}

和另一个扩展 FOO 的包:

package FOOBAR;
use Moose;
extends 'FOO';
has [qw/val1 val2/] => (is => 'rw');
sub BUILD {
    my ($self) = @_;
    $self->val1($self->hash->{val1});
    $self->val2($self->hash->{val2});
}

基本上我想做FOOBAR->new(obj=>$obj); 并使用从$obj 生成的散列来填充FOOBAR 中指定的属性(大约20 个属性)

像这样使用“BUILD”是解决问题的好方法吗?

【问题讨论】:

    标签: perl moose


    【解决方案1】:

    为什么?然后你会得到两个数据副本。改为委托。

    has obj => (
       is      => 'ro',
       handles => {
          val1 => sub { my $self = shift; my $obj = $self->obj; ... },
          val2 => sub { my $self = shift; my $obj = $self->obj; ... },
       },
    );
    

    如果访问器实际上是相同的,你可以这样做

    sub make_obj_accessor {
       my ($name) = @_;
       return sub {
          my $self = shift;
          my $obj = $self->obj;
          ... $name ...
       };
    }
    
    has obj => (
       is      => 'ro',
       handles => {
          (map make_obj_accessor($_), qw(
             val1
             val2
          ))
       },
    );
    

    当然,如果你真的只有一个哈希,你所需要的就是

    FOOBAR->new( %hash )
    

    【讨论】:

    • 谢谢,但我正在使用哈希($self->hash,它对从 $self->obj 构造 a 有一些魔力),而且我不能委托给键在哈希中?
    • @simon_,你说它是一个散列,但你继续称它为$obj 并说散列实际上是由它构造的。哪一个?如果$obj 是一个对象,请使用委托。在委托中放置您需要的任何“魔法”。 (例如val1 => sub { my $self = shift; my $obj = $self->obj; ... }
    • 嗯,我传递给构造函数的 $obj 是一个对象。我想用于 FOOBAR 属性的值的散列是从 $obj 使用自定义方法“make_hash”生成的。我真的不明白这是怎么不清楚的..
    • 感谢更新代码。我想我可以做这样的事情!
    • 实际上...建议的委托方法将效率低下,因为我将不得不在'handles'中的任何子引用中破坏/解码/等 $self->obj
    猜你喜欢
    • 2021-01-22
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 2018-04-02
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多