perl - 使用带有 Moose 类型约束的祝福 CodeRefs

标签 perl moose moosex-types

我们使用 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 .它允许以下操作:

  • Unblessed 代码引用。
  • 有福的代码引用。
  • 伪装成代码引用的对象(即重载 &{} 的对象)。


  • 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/

    相关文章:

    perl - Perl Moose类设计

    perl - 使对象实例不可变

    perl - MooseX::Types 声明问题,严格的测试用例:)

    Perl Moose TypeDecorator 错误。我该如何调试?

    perl - MooseX::Types 强制转换和 $self

    perl - perl上传到YouTube

    perl - Perl 中的美元插入符号零变量 ( $^0 ) 是什么?

    perl - 在角色中设置闹钟

    regex - Perl:如何在文件中插入行?

    perl - 正在安装模块(不是?),因为它是最新的(是吗?)