2016-11-11 1 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行目で定義されています)の行100の値が100の「Maybe [MyStatus]」の検証に失敗しました

そのメッセージをどのように動作させるには? ありがとうございました!

+1

エラーメッセージを再入力しないでください。代わりにコピーして貼り付けてください。イタリック引用にスペルミスがあります。 ;-) – simbabque

+0

私はそれをコピーして貼り付けた – AndyH

+0

あなたの端末ウィンドウがテキストのために小さすぎたので、おそらく出力の改行であったでしょう。気にしないで。 ;) – simbabque

答えて

1

Maybe[]はエラーメッセージを食べます。それを削除すると、あなたのタイプからmessageが得られます。ここで

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

は誤りです:

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

Maybe[]自体も単なる関数呼び出しであるためです。 MyStatusのコード参照を、コンストラクタに渡した値(ここでは100)で呼び出す戻り値をチェックします。その型チェックが合格すると、すべて正常です。しかし、チェックが失敗すると、Maybe[]はそれ自身のエラーメッセージを出します。

自分自身にこの質問をしてください。statusundefになることを本当に欲しいですか?あなたはそれをrequiredにしなかったので、省略することができます。あなたのオブジェクトはステータスがありません。が未定義のステータスとは異なります。ステータスとは、オブジェクトが特定の状態にあることを意味し、その状態は意味を持ちます。その状態が定義されていない場合、それは私の問題のように聞こえる。

+0

行1337は偶然です... – simbabque

+0

「未知」を定義する実際のコードが見つかりません。私は間違ったものを探しているに違いない。 – simbabque

+0

ありがとう!この動作を無効にする方法はありますか?私は未定義またはint値の小さな範囲を受け入れる必要があります。 – AndyH

関連する問題