Moose在类型联盟上的特征

时间:2011-12-12 23:50:05

标签: perl moose

在Moose v1.x中,我曾经能够这样做:

package Class;
use Test::More tests => 1;
use Moose;
use MooseX::Types::Moose qw/Undef Str/;

eval {
  has 'trait_boom' => (
    is => 'rw'
    , isa => Str | Undef
    , default => ''
    , traits => ['String']
  );
};

ok ( !$@, "Created attr trait_boom, a type union of Str and Undef\n$@" );

然而,它不再适用于Moose 2.x.我假设这是is a bug。为什么Moose会向后兼容?还有另一种方法可以完成这项工作。我希望它可以是UndefStr。我不想强迫Undef为空字符串。

我只是在这里问,因为显然磁铁已经坏了

17:43 [perl2] -!- ERROR Closing Link: 64.200.109.13 (Banned)

2 个答案:

答案 0 :(得分:2)

我猜这会在2011年9月23日星期五的Moose 2.0300中发生变化:

  
      
  • ->is_subtype_of->is_a_type_of方法改变了他们的行为   对于工会类型。以前,如果他们的任何成员,他们返回真实   对于给定类型,types返回true。现在,所有成员类型都必须   返回true。 RT #67731。 (戴夫罗尔斯基)
  •   

您是否尝试过Maybe[Str]而不是Str | Undef

答案 1 :(得分:2)

正如我们在报告你禁止逃税后我们在MagNet上告诉你的那样,这不是一个错误。特征的方法永远不应该对Undef值起作用,所以允许这种行为在1.x中起作用就是bug。 Moose有针对正确行为进行优化的方法,并且从未承诺版本之间的错误比较。

您需要编写自己的特征或手动编写方法来处理这种情况。