我可以使用正则表达式作为参数在Moose中使用isa吗?如果不可能,我可以使用->isa
之外的其他内容实现相同的目标吗?
好的,拥有以下类型Animal::Giraffe
,Animal::Carnivore::Crocodile
,我想->isa(/^Animal::/)
,我可以这样做吗?如果我不能,我可以用什么来达到预期的效果?
答案 0 :(得分:8)
这些相关类型应该“扮演”相同的角色,动物。然后你可以写:
has 'animal' => (
is => 'ro',
does => 'Animal',
required => 1,
);
现在你有一些比正则表达式更可靠的东西来确保程序的一致性。
答案 1 :(得分:4)
Leon Timmermans的回答与我的建议很接近,虽然我使用的是Moose :: Util :: TypeConstraints
use Moose;
use Moose::Util::TypeConstraints;
subtype Animal => as Object => where { blessed $_ =~ /^Animal::/ };
has animal => ( is => 'rw', isa => 'Animal' );
答案 2 :(得分:4)
扩展perigrin的答案,这样如果类在其超类中的任何位置都有Animal::*
,并且不仅在其直接类名中(例如,如果Helper::Monkey
isa 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建议使用角色有很多优点,但如果你想这样做,你可以覆盖所有的基础。
答案 3 :(得分:1)
我认为应该这样做。
use Moose;
use Moose::Util::TypeConstraints;
my $animal = Moose::Meta::TypeConstraint->new(
constraint => sub { $_[0] =~ /^Animal::/}
);
has animal => (is => 'rw', isa => $animal);
ETA:我同意jrockway:除非你有一个令人信服的理由,否则你应该使用继承。