2016-11-11 14 views
1

Я начинаю использовать Moose. Вот мой тестовый пакет код:Moose: сообщение подтипа не отображается

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» ошибка, но вместо этого я получил это:

Атрибут (статус) не передает ограничение типа, потому что: сбой проверки для «Может быть [MyStatus]» со значением 100 в accessor MyTest :: s tatus (определенный в MyTest.pm line 10) строка 4

Как заставить это сообщение работать? Спасибо!

+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[] также просто вызов функции. Он проверяет возвращаемое значение вызова кода ref за MyStatus со значением, которое вы передаете конструктору (здесь это 100). Если проверка этого типа проходит, все хорошо. Но если эта проверка завершилась неудачно, Maybe[] выдает собственное сообщение об ошибке.

Вы должны задать себе этот вопрос: Вы действительно хотите, чтобы status может быть undef? Вы не сделали это required, так что вы можете его опустить. Тогда ваш объект не имеет статуса, который отличается от статуса не определено. Статус означает, что объект находится в определенном состоянии, где состояние имеет значение. Если это состояние не определено, это звучит как неприятность для меня.

+0

Строка 1337 - это совпадение ... – simbabque

+0

Я не могу найти код, определяющий 'Maybe'. Я должен искать неправильные вещи. – simbabque

+0

Спасибо! Любой способ отменить это поведение? Мне нужно, чтобы он принял undef или небольшой диапазон значений int. – AndyH

 Смежные вопросы

  • Нет связанных вопросов^_^