我们使用 Moose 类将迭代器序列化为各种输出格式。我们将迭代器描述为一个属性:
has iterator => (
is => 'ro',
isa => 'CodeRef',
required => 1,
);
到目前为止效果很好,但我们最近一直在使用 Iterator::Simple准备迭代器以供以后使用。这意味着我们可以开始写这个:
has iterator => (
is => 'ro',
isa => 'CodeRef|Iterator::Simple::Iterator',
required => 1,
);
并允许我们的序列化程序正确地接受迭代器类。然而,这似乎是一个不完整的解决方案。
Moose 有没有办法指定属性必须是可调用的约束?我怀疑 Moose::Util::TypeConstraints 有可能并使用 overload::Overloaded在
&{}
进行检查,但我想知道是否有人已经创建了一个模块来执行此操作,或者是否有 Moose 标准的测试方法。
最佳答案
CodeRef
只允许未授权的代码引用。幸运的是,制作自己的类型很容易。
定义 Callable
如下图,然后用它代替CodeRef
.它允许以下操作:
&{}
的对象)。 use Moose::Util::TypeConstraints;
use overload qw( );
use Scalar::Util qw( );
subtype 'Callable'
=> as 'Ref'
=> where {
Scalar::Util::reftype($_) eq 'CODE'
||
Scalar::Util::blessed($_) && overload::Method($_, "&{}")
}
# Written such that parent's inline_as needs not be prepended.
=> inline_as {'(
(Scalar::Util::reftype('.$_[1].') // "") eq 'CODE'
||
Scalar::Util::blessed('.$_[1].') && overload::Method('.$_[1].', "&{}")
)'};
no Moose::Util::TypeConstraints;
关于perl - 使用带有 Moose 类型约束的祝福 CodeRefs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9022097/