Moose属性强制 - MooseX :: Types :: URI

时间:2013-12-12 13:36:46

标签: perl moose

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 *的来源?如何理解这一点?我应该阅读什么?

1 个答案:

答案 0 :(得分:1)

  

可以请某人解释我,我做错了什么?

无。与消息中说的一样,没有规则定义如何强制StrMaybe[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))。


注意:

  1. 我曾经提供过一个补丁来为Maybe添加强制支持,但它被拒绝了,因为他们不喜欢Maybe。 (至少,这就是他们告诉我的。)