2016-11-11 18 views
1

무스 사용을 시작합니다. 여기 내 테스트 패키지 코드 :무스 : 하위 유형 메시지가 표시되지 않습니다.

package MyTest; 
use Moose; 
use Moose::Util::TypeConstraints; 

subtype 'MyStatus', 
     as 'Int', 
     where { $_ >= 0 && $_ < 10 }, 
     message { "Wrong status: $_" }; 

has status => (is => 'rw', isa => 'Maybe[MyStatus]'); 

no Moose; 1; 

그리고 여기에 프로그램입니다 :

use strict; 
use warnings; 
use MyTest; 

my $t1 = MyTest->new('status' => 3); 
$t1->status(100); 

내가 얻을 것으로 기대 "잘못된 상태 : (100)"오류, 대신 나는이있어 :

속성 (상태)이 다음과 같은 이유로 유형 제약 조건을 전달하지 못했습니다. 접근 자 MyTest :: s tatus (MyTest.pm 라인 10에서 정의 됨) 행 4에서 값이 100 인 'Maybe [MyStatus]'유효성 검사가 실패했습니다.

그 메시지를 작동시키는 방법? 감사합니다.

+1

오류 메시지를 다시 입력하지 마십시오. 대신 복사하여 붙여 넣으십시오. 이탤릭 인용에 맞춤법 오류가 있습니다. ;-) – simbabque

+0

복사하여 붙여 넣기 – AndyH

+0

터미널 창문이 너무 작아서 출력에서 ​​줄 바꿈이 된 것 같습니다. 신경 쓰지 마. ;) – simbabque

답변

1

Maybe[]은 오류 메시지를 표시합니다. 제거하면 해당 유형에서 message이 제공됩니다. Maybe[] 자체도 단지 함수 호출 때문에

Attribute (status) does not pass the type constraint because: Wrong status: 100 at accessor MyTest::status (defined at /home/foo/code/scratch.pl line 1331) line 4 MyTest::status('MyTest=HASH(0x3434c58)', 100) called at /home/foo/code/scratch.pl line 1337

그건 :

has status => (is => 'rw', isa => "MyStatus"); 

다음은 오류입니다. MyStatus 뒤의 코드 참조를 생성자에 전달한 값 (여기서는 100)으로 반환하는 값을 확인합니다. 해당 유형 검사가 통과되면 모두 정상입니다. 그러나 검사에 실패하면 Maybe[]이 자체 오류 메시지를 발행합니다.

스스로에게 질문해야합니다. statusundef 일 수 있으십니까? 너는 그것을 required으로 만들지 않았으므로 그것을 생략 할 수있다. 그런 다음 개체의 상태가 0이 아니며 상태가 정의되지 않음 상태와 다릅니다. 상태는 객체가 특정 상태에 있음을 의미합니다. 여기에는 상태가 의미가 있습니다. 그 상태가 정의되지 않은 경우 그것은 나에게 문제가되는 것처럼 들린다.

+0

라인 1337은 우연의 일치입니다 ... – simbabque

+0

'미정'을 정의하는 실제 코드를 찾을 수 없습니다. 나는 틀린 재료를 찾고있을거야. – simbabque

+0

감사합니다! 이 문제를 무시할 수있는 방법이 있습니까? 그것은 int 값의 undef 또는 작은 범위를 받아 들일 필요가있다. – AndyH