0

パッケージで 'perl -c' を実行するとコンパイル時エラーが発生します (Moose は不変インスタンスの変更について不平を言います) が、パッケージを使用するコードはエラーなしで実行されます。コード例:

ファイル Pa_1.pm (MooseX::Aliases とパッケージ Pa_2.pm を使用した不変の Moose クラス):

package Pa_1;

use Pa_2;

use Moose;

# uncommenting either this line ...
use MooseX::Aliases;

# ... or this line to make 'perl -c' work
__PACKAGE__->meta->make_immutable;

1;

ファイル Pa_2.pm (Pa_2.pm を使用する Pa_1.pm のみを使用):

package Pa_2;

use Pa_1;
1;

ファイル run_pa_1.pl :

#!/usr/bin/env perl

use Pa_1;

my $pa1 = Pa_1->new();
print "Done !\n";

run_pa_1.pl を実行すると機能しますが、「perl -c Pa_1.pm」を実行すると

The 'add_method' method cannot be called on an immutable instance at /home/pecho/perl5/perlbrew/perls/perl-5.16.1/lib/site_perl/5.16.1/x86_64-linux/Class/MOP/Class/Immutable/Trait.pm line 32.
        Class::MOP::Class::Immutable::Trait::_immutable_cannot_call('add_method') called at /home/pecho/perl5/perlbrew/perls/perl-5.16.1/lib/site_perl/5.16.1/x86_64-linux/Class/MOP/Class/Immutable/Trait.pm line 47
        Class::MOP::Class:::around('CODE(0xc10158)', 'Class::MOP::Class::Immutable::Moose::Meta::Class::__ANON__::S...', 'DESTROY', 'Moose::Meta::Method::Destructor=HASH(0x14af4f8)') called at /home/pecho/perl5/perlbrew/perls/perl-5.16.1/lib/site_perl/5.16.1/x86_64-linux/Class/MOP/Method/Wrapped.pm line 162
        Class::MOP::Method::Wrapped::__ANON__('Class::MOP::Class::Immutable::Moose::Meta::Class::__ANON__::S...', 'DESTROY', 'Moose::Meta::Method::Destructor=HASH(0x14af4f8)') called at /home/pecho/perl5/perlbrew/perls/perl-5.16.1/lib/site_perl/5.16.1/x86_64-linux/Class/MOP/Method/Wrapped.pm line 91
        Class::MOP::Class::Immutable::Moose::Meta::Class::__ANON__::SERIAL::1::add_method('Class::MOP::Class::Immutable::Moose::Meta::Class::__ANON__::S...', 'DESTROY', 'Moose::Meta::Method::Destructor=HASH(0x14af4f8)') called at /home/pecho/perl5/perlbrew/perls/perl-5.16.1/lib/site_perl/5.16.1/x86_64-linux/Class/MOP/Mixin/HasMethods.pm line 181
        Class::MOP::Mixin::HasMethods::_restore_metamethods_from('Class::MOP::Class::Immutable::Moose::Meta::Class::__ANON__::S...', 'Class::MOP::Class::Immutable::Moose::Meta::Class::__ANON__::S...') called at /home/pecho/perl5/perlbrew/perls/perl-5.16.1/lib/site_perl/5.16.1/x86_64-linux/Class/MOP/Class.pm line 405
        Class::MOP::Class::_restore_metaobjects_from('Class::MOP::Class::Immutable::Moose::Meta::Class::__ANON__::S...', 'Class::MOP::Class::Immutable::Moose::Meta::Class::__ANON__::S...') called at /home/pecho/perl5/perlbrew/perls/perl-5.16.1/lib/site_perl/5.16.1/x86_64-linux/Moose/Meta/Class.pm line 728
        Moose::Meta::Class::_restore_metaobjects_from('Class::MOP::Class::Immutable::Moose::Meta::Class::__ANON__::S...', 'Class::MOP::Class::Immutable::Moose::Meta::Class::__ANON__::S...') called at /home/pecho/perl5/perlbrew/perls/perl-5.16.1/lib/site_perl/5.16.1/x86_64-linux/Class/MOP/Class.pm line 65
        Class::MOP::Class::reinitialize('Class::MOP::Class::Immutable::Moose::Meta::Class::__ANON__::S...', 'Class::MOP::Class::Immutable::Moose::Meta::Class::__ANON__::S...', 'error_class', 'Moose::Error::Default', 'wrapped_method_metaclass', 'Class::MOP::Method::Wrapped', 'instance_metaclass', 'Moose::Meta::Instance', 'method_metaclass', ...) called at /home/pecho/perl5/perlbrew/perls/perl-5.16.1/lib/site_perl/5.16.1/x86_64-linux/Moose/Meta/Class.pm line 188            Moose::Meta::Class::reinitialize('Class::MOP::Class::Immutable::Moose::Meta::Class::__ANON__::S...', 'Class::MOP::Class::Immutable::Moose::Meta::Class::__ANON__::S...', 'attribute_metaclass', 'Moose::Meta::Class::__ANON__::SERIAL::2') called at /home/pecho/perl5/perlbrew/perls/perl-5.16.1/lib/site_perl/5.16.1/x86_64-linux/Moose/Util/MetaRole.pm line 99            Moose::Util::MetaRole::_make_new_metaclass('Class::MOP::Class::Immutable::Moose::Meta::Class::__ANON__::S...', 'HASH(0x144f868)', 'class') called at /home/pecho/perl5/perlbrew/perls/perl-5.16.1/lib/site_perl/5.16.1/x86_64-linux/Moose/Util/MetaRole.pm line 28            Moose::Util::MetaRole::apply_metaroles('for', 'Class::MOP::Class::Immutable::Moose::Meta::Class::__ANON__::S...', 'class_metaroles', 'HASH(0x144f868)', 'role_metaroles', 'HASH(0x144f838)') called at /home/pecho/perl5/perlbrew/perls/perl-5.16.1/lib/site_perl/5.16.1/x86_64-linux/Moose/Exporter.pm line 543
        Moose::Exporter::_apply_metaroles('Pa_1', 'ARRAY(0x93c630)', 'CODE(0xddccc8)') called at /home/pecho/perl5/perlbrew/perls/perl-5.16.1/lib/site_perl/5.16.1/x86_64-linux/Moose/Exporter.pm line 460
        Moose::Exporter::__ANON__('MooseX::Aliases') called at Pa_1.pm line 6
        Pa_1::BEGIN() called at Pa_1.pm line 6
        eval {...} called at Pa_1.pm line 6
BEGIN failed--compilation aborted at Pa_1.pm line 6.

Pa_2.pm で perl をコンパイル スイッチで起動するとエラーが発生するため、少し混乱していますが、実行時間は問題ないようです。

  • デバッガーで「use Pa_2」を実行してもエラーは発生しません。
  • 「perl -c run_pa_1.pl」を実行してもエラーはありません。
  • MooseX::Aliases を使用しないか、Pa_1.pm を不変にしないと、'perl -c Pa_1.pm' がエラーなしでコンパイルされます。

MooseX::Aliases のコードにバグがありますか、それとも Moose の内部にあるものですか?

使用したバージョン: perl 5.16.1; ムース 2.0604; MooseX::エイリアス 0.10;

4

2 に答える 2

1

モジュールを直接実行しないでください。コンパイルと実行を 2 回行うことになります。

同様に、モジュールを直接コンパイルしないでください。あなたはそれを2回コンパイルすることになります。

perl -c Pa_1.pm

したほうがいい

perl -c -e'use Pa_1;'

perl -c Pa_1.pm以下を実行します (無視requireimportて何もしません):

package Pa_1;
require Pa_2;

package Pa_2;
require Pa_1;

package Pa_1;
require Moose;
import Moose;
require MooseX::Aliases;
import MooseX::Aliases;
__PACKAGE__->meta->make_immutable;
1;

package Pa_2;
1;

package Pa_1;
import Moose;
import MooseX::Aliases;

perl -c -e'use Pa_1;以下を実行します (無視requireimportて何もしません):

package Pa_1;
require Pa_2;

package Pa_2;
1;

package Pa_1;
require Moose;
import Moose;
require MooseX::Aliases;
import MooseX::Aliases;
__PACKAGE__->meta->make_immutable;
1;

最終的にどのように行動するかに注意してください

import Moose;
import MooseX::Aliases;

した後

__PACKAGE__->meta->make_immutable;

間違ったときは?

于 2012-11-05T21:38:33.750 に答える
0

この Pa_1.pm での順序付けはうまくいきますか?

package Pa_1;

use Moose;
use MooseX::Aliases;

use Pa_2;

__PACKAGE__->meta->make_immutable;

Moose一般的には、すべてのモジュールを最初に配置することをお勧めします。

于 2012-11-05T15:31:27.923 に答える