代码之家  ›  专栏  ›  技术社区  ›  xxxxxxx

我可以用基于Moose的对象将正则表达式传递给isa()吗?

  •  4
  • xxxxxxx  · 技术社区  · 14 年前

    我可以在Moose中使用isa和regex作为参数吗?如果不可能的话,我能用别的东西来达到同样的效果吗 ->isa ?

    Animal::Giraffe , Animal::Carnivore::Crocodile ->isa(/^Animal::/) ,我可以这样做吗?如果我不能,我可以用什么来达到预期的效果?

    4 回复  |  直到 3 年前
        1
  •  8
  •   jrockway    14 年前

    这些相关的类型应该都“做”相同的角色,动物。然后你可以写:

    has 'animal' => (
        is       => 'ro',
        does     => 'Animal',
        required => 1,
    );
    

    现在您有了比regex更可靠的东西来确保程序的一致性。

        2
  •  4
  •   perigrin    14 年前

    Leon Timmermans的答案接近我的建议,尽管我会使用Moose::Util::TypeConstraints中的糖

    use Moose;
    use Moose::Util::TypeConstraints;
    
    subtype Animal => as Object => where { blessed $_ =~ /^Animal::/ };
    
    has animal => ( is => 'rw', isa => 'Animal' );
    
        3
  •  4
  •   hobbs    14 年前

    扩展perigrin的答案,这样如果班上有 Animal::* Helper::Monkey 伊萨 Animal::Monkey ):

    use Moose;
    use Moose::Util::TypeConstraints;
    
    subtype Animal => 
      as Object =>
      where { grep /^Animal::/, $_->meta->linearized_isa };
    
    has animal => ( is => 'rw', isa => 'Animal' );
    

    我认为jrockway建议使用一个角色来代替它有很多优点,但是如果你想这样做的话,你最好涵盖所有的基础。

        4
  •  0
  •   Leon Timmermans    14 年前

    我想应该这样做。

    use Moose;
    use Moose::Util::TypeConstraints;
    
    my $animal = Moose::Meta::TypeConstraint->new(
        constraint => sub { $_[0] =~ /^Animal::/}
    );
    
    has animal => (is => 'rw', isa => $animal);