2011-12-12 210 views
0

在穆斯1.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 ([email protected], "Created attr trait_boom, a type union of Str and Undef\[email protected]"); 

但是,它不再与驼鹿2.x的工作我假设这is a bug。为什么穆斯打破向后兼容性?是否有另一种方式来完成这项工作。我希望那是UndefStr。我不想强制Undef为空字符串。

我只在这里问,因为显然磁铁是打破

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

回答

2

我猜这是在穆斯2.0300,周五,2011年9月23日改为:

  • ->is_subtype_of和对于联合类型,->is_a_type_of方法已更改其行为 。以前,如果它们的任何成员 类型对于给定类型返回true,则返回true。现在,所有的成员类型必须 返回true。 RT #67731。 (戴维Rolsky)

你试过Maybe[Str]而不是Str | Undef

+0

是的,都失败了。 –

2

正如我们在MagNet上告诉你的,因为我报告了你的禁止逃税行为,这不是一个错误。特质的方法不应该违背值Undef,所以允许这种行为在1.x下工作就是bug。穆斯具有针对正确行为进行优化的方式,并且从未承诺版本之间的bug兼容。

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

+0

有没有一种更简单的方式来使特质适用只有当属性通过'is_Str()'?这听起来像是针对这个非问题的更好的解决方案。 我以前只是做 '$ foo-> trait_provided_attribute if defined $ foo-> attribute;' 这对我来说工作得很好。 –

+0

属性特征适用于类声明时,该值仅在实例化对象时可用,所以在这里应用特质为时已晚(某些奇怪的黑客被排除)。就个人而言,我只是提出两个属性。 – phaylon