Perl 类型化属性的Moose空值
在Moose中是否有某种方法可以指定我希望属性具有特定类型,但也允许存在空值(undf?) 例如,我正在编写一个链表的简单实现,并且有一个节点类,其中Perl 类型化属性的Moose空值,perl,moose,Perl,Moose,在Moose中是否有某种方法可以指定我希望属性具有特定类型,但也允许存在空值(undf?) 例如,我正在编写一个链表的简单实现,并且有一个节点类,其中next和prev指针必须是Node类型(这可能是您所期望的) 但我希望使用存储在列表头部的哨兵式空节点来标记头部,而不是列表的实际元素。因此,元素列表[1,2,3]实际上如下所示: EMPTY -> 1 -> 2 -> 3 我希望能够为next和prev指针指定一个空值(如unde),但是当我在我的List类中创建一个空节点时
next
和prev
指针必须是Node
类型(这可能是您所期望的)
但我希望使用存储在列表头部的哨兵式空节点来标记头部,而不是列表的实际元素。因此,元素列表[1,2,3]实际上如下所示:
EMPTY -> 1 -> 2 -> 3
我希望能够为next
和prev
指针指定一个空值(如unde),但是当我在我的List类中创建一个空节点时:
package List;
{
use Moose;
has 'head' => (
is => 'rw',
isa => 'Node',
# empty head node
default => sub {
Node->new( value => undef, next => undef, prev => undef );
},
);
驼鹿抱怨是因为undef
不是Node
类型
有办法解决这个问题吗 您可以使用Maybe[type]
语法来允许类型或undef
。例如:
has 'head' => (
is => 'rw',
isa => 'Maybe[Node]',
# empty head node
default => sub {
Node->new( value => undef, next => undef, prev => undef );
}
);
作者更喜欢Undef | Node
而不是Maybe[Node]
has 'prev' => (
is => 'rw',
isa => 'Undef|Node',
predicate => 'has_prev',
);
下一个:
use 5.014;
use warnings;
package Node {
use Moose;
has 'value' => ( is => 'rw');
has 'prev' => ( is => 'rw', isa => 'Undef|Node', predicate => 'has_prev', default=>undef );
has 'next' => ( is => 'rw', isa => 'Undef|Node', predicate => 'has_next', default=>undef );
}
package List {
use Moose;
has 'head' => ( is => 'rw', isa => 'Node', default => sub { Node->new() } );
}
package main;
use Data::Dumper;
my $list = List->new();
say Dumper $list;
印刷品:
$VAR1 = bless( {
'head' => bless( {
'next' => undef,
'prev' => undef
}, 'Node' )
}, 'List' );
对于基本的层次结构来说:
Undef'rw',
isa=>Object | FileHandle',)
正如其他人已经说过的,这里也有一个也许[某物]
,我不知道什么更好,但是某物|某物
看起来更“perlish”(IMHO)。) 这里有记录:哪些作者?(关于Moose?)你能链接到你发现这个的地方吗?我能找到的只是“Undef类型约束现在大部分都正常工作了,但是边缘情况可能仍然存在,请谨慎使用。”@Hunter McMillen,Moose,在与我的通信中。也许在我提交的错误报告中?
$VAR1 = bless( {
'head' => bless( {
'next' => undef,
'prev' => undef
}, 'Node' )
}, 'List' );
Undef <---- undefined
Defined
Value
Str
Num
Int
ClassName <---- Class name
RoleName