MooseX::Types::URI的概要说:
使用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
错误:
你不能强制属性(url),除非它的类型(Maybe [Uri])有 强调./maybe第9行。
使用:
my $m1 = My->new( url => 'http://example.com' );
不同的错误:
你不能强制属性(url),除非它的类型(Maybe [Uri])有 ./maybe第9行的胁迫。 属性(url)不传递类型 约束因为:'Maybe [Uri]'的值验证失败 <{3}}
好的,接下来尝试 - 没有''
:
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' );
除非属性类型,否则不能强制转换属性(url) (也许[MooseX :: Types :: URI :: Uri])在./maybe第9行有强制。
属性(url)不传递类型约束,因为:验证 'Maybe [MooseX :: Types :: URI :: Uri]'失败了 <{3}}
不要做任何事情。不再需要尝试,什么都不成功。
我真的想要了解如何决定如何使用已经开发的 CPAN定义的MooseX类型,何时使用''
以及何时使用use MooseX::Types::Moose qw( ArrayRef );
use MooseX::Types::Path::Class qw( Dir );
has 'volumes' => (
is => 'ro',
isa => ArrayRef[Dir],
required => 1,
coerce => 1,
);
以及如何使用以上将有效...
请有人解释我,我做错了什么?我从任何doccu中错过了什么,特别是来自:
或者我还应该阅读什么?
一个绝望的穆斯初学者......;(
我的问题基于Moose::Manual::Types答案(以及其他答案),其中 - 例如:
ArrayRef
裸词“语法”是必须的。我只将Maybe
更改为Dir
,将Uri
更改为ArrayRef[Dir]
。
所以,主要的问题仍然是,一个普通的perl初学者如何决定何时可以/必须使用“bareword”语法以及何时使用“string”-syntax?
为什么Maybe[Uri]
有效(必须)而{{1}}无效?为何如此不一致?为了理解这一点,我必须研究Moose *的来源?如何理解这一点?我应该阅读什么?
答案 0 :(得分:1)
可以请某人解释我,我做错了什么?
无。与消息中说的一样,没有规则定义如何强制Str
到Maybe[Uri]
。你必须定义一个。
那就是说,我不知道这是否可能。另一种方法是使用
'Undef|Uri'
而不是
'Maybe[Uri]'
好的,接下来尝试 - 没有
''
Maybe[...]
根本不是Perl语法。
另一次尝试,添加了
use MooseX::Types::Moose qw( Maybe );
实际上,这适用于我(即给出强制错误而不是语法错误)。应该如此,它创建了一个函数,当传递对包含字符串Maybe[Uri]
(Uri
又名Maybe( [ Uri() ] )
)的数组的引用时返回字符串Maybe[Uri]
。
我真的想学习如何决定如何使用已经开发的CPAN定义的MooseX类型,何时使用''以及何时使用',以及上述方法将如何运作......
您必须提供一个类型名称的字符串。通常使用字符串文字(例如'Str'
)完成,但任何表达式都可以(例如chr(53).chr(74).chr(72)
)。
注意:
Maybe
添加强制支持,但它被拒绝了,因为他们不喜欢Maybe
。 (至少,这就是他们告诉我的。)