2012-11-05 4 views
0

컴파일 시간 오류가 발생합니다 (변경 가능 인스턴스를 수정하는 것에 대해 무스가 불평합니다) 패키지에서 'perl -c'를 실행하지만 패키지를 사용하는 코드는 오류를 실행합니다. -비어 있는. 예제 코드 : (단지 Pa_1.pm 사용MooseX :: Aliases의 컴파일 시간 문제, 불변 및 순환 '사용'

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 (MooseX :: 별칭 및 패키지 Pa_2.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 작업을 실행하지만, '펄 -c Pa_1.pm은 '오류가 컴파일 스위치 Pa_2.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 사용'도 오류가 없습니다.
  • 'perl -c run_pa_1.pl'을 실행해도 오류가 없습니다.
  • MooseX :: Aliases를 사용하지 않거나 Pa_1.pm을 변경할 수 없도록 설정하면 'perl -c Pa_1.pm'이 오류없이 컴파일됩니다.

코드에있는 MooseX :: Aliases에 버그가 있습니까? 아니면 무언가에 뭔가 있습니까?

사용 된 버전 : perl 5.16.1; 무스 2.0604; MooseX :: Aliases 0.10;

답변

1

모듈을 직접 실행하지 마십시오. 결국 두 번 컴파일하고 실행하게됩니다.

마찬가지로 모듈을 직접 컴파일하지 마십시오. 결국 두 번 컴파일됩니다.

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__->meta->make_immutable; 

을 수행 한 후

import Moose; 
import MooseX::Aliases; 

일을 끝낼 방법

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; 

주의 사항?

+0

훌륭한 답변 (평소와 마찬가지로 ;-)) - 감사합니다. 나는 그 점을 알고 있다고 생각한다. 'perl -c Pa_1.pm' – katastrophos

+0

(위에서 계속되는 주석)을 실행하면 Pa_1.pm이 두 번 실행됩니다. 직접 호출하는 하나의 실행과 Pa_2.pm에서 'use Pa_1'에 대한 하나의 실행. 이전에는 'Pa_1 사용'이 없었기 때문에 표시되지 않았습니다. MooseX :: Alieses는 클래스 수정을 시도합니다. Pa_1.pm에 'BEGIN {$ DB :: single = 1}'행을 넣고 디버그하면 실행을 따라갈 수 있습니다. – katastrophos

+0

닫기. 'perl -c Pa_1.pm'은'Pa_1.pm'을 두 번 컴파일하지만 한번만 실행합니다. ('perl'에 의해 직접 호출되면 컴파일되고,'used'에 의해'called "될 때 컴파일되고 실행됩니다.)'perl Pa_1.pm'은 두 번 컴파일되어 실행됩니다. – ikegami

0

Pa_1.pm의 주문이 효과가 있습니까?

package Pa_1; 

use Moose; 
use MooseX::Aliases; 

use Pa_2; 

__PACKAGE__->meta->make_immutable; 

은 내가 먼저 Moose 모든 모듈을 넣어 일반적으로 적당하다 생각합니다.

+0

예. 작동합니다. 코드에서 오류가 아니지만 무스/무스 모듈은 호출 순서에 따라 다름을 의미합니까? – katastrophos

+0

나는 그렇다고 대답 할 것이다. – ErikR

+0

??? 아니요. 아직 'Pa_1'에 있습니다. – ErikR

관련 문제