1

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

#!/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";

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

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

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

我应该切换到 Moose 吗?

4

1 回答 1

3

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

sub add_attr_for_another_package {
  my ($package) = @_;
  eval("
    package $package;
    has 'q' => (is=>'rw', default=>123);
    return 1;
  ")
    or die $@;
}
于 2016-10-02T02:48:18.573 回答