2016-11-11 4 views
1

Ich fange an, Moose zu verwenden. Hier ist mein Testpaket Code:Moose: Subtype Nachricht wird nicht angezeigt

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; 

Und hier ist das Programm:

use strict; 
use warnings; 
use MyTest; 

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

Ich erwartete eine bekommen "Falscher Status: 100" Fehler, aber stattdessen habe ich dies:

Attribut (Status) übergibt die Typbeschränkung nicht, weil: Validierung fehlgeschlagen für 'Maybe [MyStatus]' mit Wert 100 bei Accessor MyTest :: s tatus (definiert in MyTest.pm Zeile 10) Zeile 4

Wie funktioniert diese Nachricht? Vielen Dank!

+1

Bitte geben Sie keine Fehlermeldungen ein. Kopieren Sie sie und fügen Sie sie stattdessen ein. Es gibt einen Schreibfehler in Ihrem Kursivkurs. ;-) – simbabque

+0

habe ich kopiert und eingefügt – AndyH

+0

Dann war es wohl ein Zeilenumbruch in der Ausgabe, weil dein Terminalfenster zu klein für den Text war. Vergiss es. ;) – simbabque

Antwort

1

Die Maybe[] isst die Fehlermeldung. Wenn Sie es entfernen, gibt es die message von Ihrem Typ.

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

Hier ist der Fehler:

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

Es ist, weil die Maybe[] sich auch Anruf nur eine Funktion ist. Es überprüft den Rückgabewert des Aufrufs des Code-ref hinter MyStatus mit dem Wert, den Sie an den Konstruktor übergeben (hier ist das 100). Wenn diese Typüberprüfung besteht, ist alles in Ordnung. Wenn diese Überprüfung fehlschlägt, gibt Maybe[] seine eigene Fehlermeldung aus.

Sie sollten sich diese Frage stellen: Wollen Sie wirklich, dass die statusundef sein kann? Sie haben es nicht required gemacht, also können Sie es weglassen. Dann hat Ihr Objekt keinen Status, der sich von einem undefinierten Status unterscheidet. Ein Status bedeutet, dass sich das Objekt in einem bestimmten Zustand befindet, in dem der Zustand eine Bedeutung hat. Wenn dieser Zustand nicht definiert ist, klingt das für mich nach Ärger.

+0

Linie 1337 ist ein Zufall ... – simbabque

+0

Ich kann nicht den tatsächlichen Code finden, der das 'Maybe' definiert. Ich muss nach dem falschen Zeug suchen. – simbabque

+0

Danke! Irgendeine Möglichkeit, dieses Verhalten zu überschreiben? Ich brauche es undef oder kleinen Bereich von int-Werten zu akzeptieren. – AndyH