首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用散列“连接”Moo对象

使用散列“连接”Moo对象
EN

Stack Overflow用户
提问于 2016-09-09 21:35:39
回答 1查看 396关注 0票数 4

在我的实际代码中,我希望将Moo (如果Moo不工作,则为Moose )对象与散列(实际上是绑定的散列)“同步”,以便读取Moo对象的属性将从散列中读取相应的值,并将Moo对象的属性写入散列中。

以下是一个简化的代码:

代码语言:javascript
复制
#!/usr/bin/perl

use feature qw(say);

package X;
use Moo;
use Data::Dumper;

my $BusinessClass = 'X';

has 'base' => (is => 'rw', builder => 'base_builder');

sub base_builder {
  return {};
}

foreach my $Key (qw(a b c)) {
  {
    no strict 'refs';
    *{"${BusinessClass}::$Key"} = sub {
      if (@_ == 2) {
        return $_[0]->base->{$Key} = $_[1];
      } else {
        return $_[0]->base->{$Key};
      }
    };
    has $Key => ( is        => 'rw',
                  lazy      => 0,
                  required  => 0,
                  reader => "${BusinessClass}::_access1_$Key",
                  writer => "${BusinessClass}::_access2_$Key",
                );
  }
}

my $obj = X->new(a=>123, b=>456);
print Dumper $obj->base;
$obj->c(789);
print Dumper $obj->base;

问题是传递给new函数的属性没有存储在has $obj->base中(但它们应该存储在其中)。在上面的代码示例中,属性c按其应有的方式正确存储,但ab没有存储到散列中。这是一个bug。

处理这种情况的好方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-12 18:52:36

这可以通过添加以下内容来解决:

代码语言:javascript
复制
sub BUILD {
  my ($self, $args) = @_;

  foreach my $Key (keys %$args) {
    $self->base->{$Key} = $args->{$Key};
    my $clearer = "_clear_local_$Key";
    $self->$clearer();
  }
}

完整代码:

代码语言:javascript
复制
#!/usr/bin/perl

use feature qw(say);

package X;
use Moo;
use Data::Dumper;

my $BusinessClass = 'X';

has 'base' => (is => 'rw', builder => 'base_builder');

sub base_builder {
  return {};
}

sub BUILD {
  my ($self, $args) = @_;

  foreach my $Key (keys %$args) {
    $self->base->{$Key} = $args->{$Key};
    my $clearer = "_clear_local_$Key";
    $self->$clearer();
  }
}

foreach my $Key (qw(a b c)) {
  {
    no strict 'refs';
    *{"${BusinessClass}::$Key"} = sub {
      if (@_ == 2) {
        return $_[0]->base->{$Key} = $_[1];
      } else {
        return $_[0]->base->{$Key};
      }
    };
    has $Key => ( is        => 'rw',
                  lazy      => 0,
                  required  => 0,
                  reader => "${BusinessClass}::_access1_$Key",
                  writer => "${BusinessClass}::_access2_$Key",
                  clearer => "_clear_local_$Key",
                );
  }
}

my $obj = X->new(a=>123, b=>456);
print Dumper $obj->base;
$obj->c(789);
print Dumper $obj->base;

print Dumper {%$obj};
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39412838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档