2013-12-12 4 views
1

Конспект для MooseX::Types::URI говорит:Moose атрибут принуждения - MooseX :: Типы :: URI

use MooseX::Types::URI qw(Uri FileUri DataUri);

Итак, мой пример кода:

package My; 
use 5.014; 
use warnings; 
use Moose; 
use MooseX::Types::URI qw(Uri); 

has 'url' => (
    is => 'rw', 
    isa => 'Maybe[Uri]', 
    coerce => 1, 
); 

package main; 
my $m0 = My->new(); #without url - ok 

Ошибка:

You cannot coerce an attribute (url) unless its type (Maybe[Uri]) has a coercion at ./maybe line 9.

С :

my $m1 = My->new(url => 'http://example.com'); 

другая ошибка:

You cannot coerce an attribute (url) unless its type (Maybe[Uri]) has a coercion at ./maybe line 9. Attribute (url) does not pass the type constraint because: Validation failed for 'Maybe[Uri]' with value http://example.com at


Итак, следующая попытка - не '':

has 'url' => (
    is => 'rw', 
    isa => Maybe[Uri], 
    coerce => 1, 
); 

Ошибка:

syntax error at ./maybe line 11, near "Maybe[" 
Execution of ./maybe aborted due to compilation errors. 

другой попробовать, добавил use MooseX::Types::Moose qw(Maybe);:

use MooseX::Types::Moose qw(Maybe); 
use MooseX::Types::URI qw(Uri); 

has 'url' => (
    is => 'rw', 
    isa => Maybe[Uri], 
    coerce => 1, 
); 

... 
my $m1 = My->new(url => 'http://example.com'); 

You cannot coerce an attribute (url) unless its type (Maybe[MooseX::Types::URI::Uri]) has a coercion at ./maybe line 9.

Attribute (url) does not pass the type constraint because: Validation failed for 'Maybe[MooseX::Types::URI::Uri]' with value http://example.com at

ничего не работает. Больше не хочу больше , что не увенчалось успехом.

Я действительно хочу УЗНАТЬ как решить, как использовать уже разработало CPAN определенных типов MooseX, когда использовать '', а когда нет, и, как выше будет работает ...

Могли пожалуйста, Кто-то объясняет мне, что я делаю неправильно? То, что я пропустил из любого doccu, особенно из:

или что иначе я должен читать?

безнадежным Moose начинающий ...; (

Редактировать

Мой вопрос основан на this ответ (и других тоже), где - например:

use MooseX::Types::Moose qw(ArrayRef); 
use MooseX::Types::Path::Class qw(Dir); 

has 'volumes' => (
    is => 'ro', 
    isa => ArrayRef[Dir], 
    required => 1, 
    coerce => 1, 
); 

bareword " синтаксис "является обязательным. Я только изменил ArrayRef на Maybe и Dir на Uri.

Итак, главный вопрос остается, как обычный начинающий perl может решить, когда может/должен использовать, используя синтаксис «bareword» и когда «string» -syntax?

Почему ArrayRef[Dir] действителен (и должен) и Maybe[Uri] нет? Почему такая несогласованность? Чтобы понять это, я должен изучить источники для Moose *? Как это понимать? Что я должен ПРОЧИТАТЬ?

+0

Re вашего обновления: 'ArrayRef [Dir]', когда у вас есть подзадача под названием 'ArrayRef' и подназвание' Dir', является сокращением для 'ArrayRef ([Dir()]). Вы можете вызывать только подзадачу 'ArrayRef', если у вас есть подзаголовок' ArrayRef'. Вы знаете, что у вас есть подзаголовок, который, когда вы его объявляете, или используете модуль, который его предоставляет. Весь смысл 'MooseX :: Types :: Moose' - создавать функции, которые возвращают свое собственное имя. – ikegami

+0

Что касается того, почему 'use MooseX :: Types :: Moose qw (Maybe);' не предоставляет 'Maybe'? Ну, это для меня. Обновлен мой ответ. – ikegami

ответ

1

Could please someone explain me, what I'm doing wrong?

Ничего. Как говорится в сообщении, нет правила, определяющего, как принуждать Str к Maybe[Uri]. Вы должны определить его.

Тем не менее, я не знаю, возможно ли это. В качестве альтернативы можно использовать

'Undef|Uri' 

вместо

'Maybe[Uri]' 

Ok, so next try - without ''

Maybe[...] просто не действует синтаксис Perl.

Another try, added the use MooseX::Types::Moose qw(Maybe);

На самом деле, это работает для меня (то есть дает ошибку принуждения, а не ошибка синтаксиса). Как и следовало ожидать, он создает функцию, которая возвращает строку Maybe[Uri] при передаче ссылки на массив, содержащий строку Uri (Maybe([ Uri() ]) aka Maybe[Uri]).


I really want LEARN how to decide how to use the already developed CPAN defined MooseX Types, when to use the '' and when not, and how the above will works...

Вы должны предоставить строку, это имя типа. Обычно это выполняется с использованием строкового литерала (например, 'Str'), но любое выражение будет делать (например, chr(53).chr(74).chr(72)).


Примечания:

  1. я однажды предоставить патч, чтобы добавить поддержку Принуждение к Maybe, но он был отклонен, потому что они не любят Maybe. (По крайней мере, это то, что они мне сказали.)
+0

Как обычно, ваш ответ правильный и работает. ;) Спасибо. Но, пожалуйста, прочитайте мой EDIT - и если это возможно, продлить ваш ответ. – novacik

+0

Отказ. Наверное, это никогда не поймет. Для вас это работает, для меня дает и ошибка. Просто помните - не используйте «Maybe», «Undef | something» работает. ;) Спасибо за помощь в любом случае. ;) – novacik

+0

Конечно, это дает ошибку. Я прямо сказал, что это так, и я объяснил ошибку. Если вы получаете * синтаксическую ошибку *, возможно, вы используете старую версию модуля? – ikegami

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

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