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";

Ypackageで定義された関数から 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 に答える