Perl 驼鹿的类型结合特征

Perl 驼鹿的类型结合特征,perl,moose,Perl,Moose,在MooseV1.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']

在MooseV1.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$@" );
但是,它不再适用于Moose2.x。我想是这样。为什么驼鹿会破坏向后兼容性?有没有别的办法完成这项工作。我希望它是
Undef
Str
。但我不想强制
unde
为空字符串

我问这个是因为磁铁坏了

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

我猜2011年9月23日星期五驼鹿2.0300中的情况有所改变:

  • ->is_subtype_of
    ->is_a_type_of
    方法已改变其行为 对于联合类型。以前,如果其成员中有任何成员 对于给定类型,类型返回true。现在,所有成员类型都必须 返回真。(戴夫·罗尔斯基)

您是否尝试过
也许[Str]
而不是
Str | unde

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

  • ->is_subtype_of
    ->is_a_type_of
    方法已改变其行为 对于联合类型。以前,如果其成员中有任何成员 对于给定类型,类型返回true。现在,所有成员类型都必须 返回真。(戴夫·罗尔斯基)

你有没有尝试过
也许[Str]
而不是
Str | unde

正如我在磁铁上告诉你的那样,就在我报告你规避禁令之后,这不是一个bug。trait的方法不应该对值Undef起作用,因此允许这种行为在1.x中起作用就是bug。Moose有针对正确行为进行优化的方法,而且从未承诺过版本之间的bug兼容


你要么需要写下自己的特点,要么手工写下处理这种情况的方法。

正如我在《磁铁》上告诉你的那样,在我报告了你的禁令规避之后,这不是一个bug。trait的方法不应该对值Undef起作用,因此允许这种行为在1.x中起作用就是bug。Moose有针对正确行为进行优化的方法,而且从未承诺过版本之间的bug兼容


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

只有当属性通过
Is_Str()
时,才有更简单的方法使特性应用吗?对于这个非问题,这听起来是一个更好的解决方案。我以前只做
$foo->trait\u提供的属性,如果定义了$foo->attribute对我来说效果很好。属性特征是在类声明时应用的,值只有在实例化对象时才可用,所以在那里应用特征已经太晚了(一些奇怪的hacks除外)。就我个人而言,我只需要做两个属性。只有当属性通过
Is_Str()?对于这个非问题,这听起来是一个更好的解决方案。我以前只做
$foo->trait\u提供的属性,如果定义了$foo->attribute对我来说效果很好。属性特征是在类声明时应用的,值只有在实例化对象时才可用,所以在那里应用特征已经太晚了(一些奇怪的hacks除外)。就我个人而言,我只需要做两个属性。