在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会向后兼容?还有另一种方法可以完成这项工作。我希望它可以是Undef
或Str
。我不想强迫Undef
为空字符串。
我只是在这里问,因为显然磁铁已经坏了
17:43 [perl2] -!- ERROR Closing Link: 64.200.109.13 (Banned)
答案 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有针对正确行为进行优化的方法,并且从未承诺版本之间的错误比较。
您需要编写自己的特征或手动编写方法来处理这种情况。