Perl 类型化属性的Moose空值

Perl 类型化属性的Moose空值,perl,moose,Perl,Moose,在Moose中是否有某种方法可以指定我希望属性具有特定类型,但也允许存在空值(undf?) 例如,我正在编写一个链表的简单实现,并且有一个节点类,其中next和prev指针必须是Node类型(这可能是您所期望的) 但我希望使用存储在列表头部的哨兵式空节点来标记头部,而不是列表的实际元素。因此,元素列表[1,2,3]实际上如下所示: EMPTY -> 1 -> 2 -> 3 我希望能够为next和prev指针指定一个空值(如unde),但是当我在我的List类中创建一个空节点时

在Moose中是否有某种方法可以指定我希望属性具有特定类型,但也允许存在空值(undf?)

例如,我正在编写一个链表的简单实现,并且有一个节点类,其中
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