【问题标题】:Moo: Add attribute to another (non-current) packageMoo:将属性添加到另一个(非当前)包
【发布时间】:2017-02-10 05:07:42
【问题描述】:

以下是我真实代码的简化示例:

#!/usr/bin/perl

package X;
use Moo;

sub add_attr_for_another_package {
  my ($package) = @_;
  eval "package $package";
  has 'q' => (is=>'rw', default=>123);
}

package Y;
use Moo;

X::add_attr_for_another_package('Y');

my $obj = Y->new;
print $obj->q, "\n";

我尝试从包X 中定义的函数向包Y 添加一个属性。这不起作用:

$ ./test.pl 
Can't locate object method "q" via package "Y" at ./test.pl line 18.

请帮助我如何从另一个包中定义的方法将属性添加到包中。

我应该改用 Moose 吗?

【问题讨论】:

    标签: perl attributes moose moo


    【解决方案1】:

    package 影响代码编译到的包。它显然不会影响已经编译的代码(例如调用has)!换句话说,当package 指令生效时,必须编译对has 的调用才能受其影响。

    sub add_attr_for_another_package {
      my ($package) = @_;
      eval("
        package $package;
        has 'q' => (is=>'rw', default=>123);
        return 1;
      ")
        or die $@;
    }
    

    【讨论】:

      猜你喜欢
      • 2015-02-09
      • 2022-06-29
      • 1970-01-01
      • 2018-05-20
      • 1970-01-01
      • 1970-01-01
      • 2015-11-16
      • 1970-01-01
      • 2017-07-28
      相关资源
      最近更新 更多