4

正規表現をパラメーターとして Moose で isa を使用できますか? 不可能な場合は、以外のもので同じことを達成でき->isaますか?

わかりました、次のタイプがあります Animal::GiraffeAnimal::Carnivore::Crocodile、やりたいのですが->isa(/^Animal::/)、できますか? できない場合、目的の効果を得るために何を使用できますか?

4

4 に答える 4

8

これらの関連するタイプはすべて同じ役割を「果たす」必要があります、動物。次に、次のように書くことができます。

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

これで、プログラムの一貫性を確保するために、正規表現よりもはるかに信頼性の高いものが得られます。

于 2010-03-14T00:25:03.993 に答える
4

ペリグリンの答えを拡張して、クラスのスーパークラスのAnimal::*どこかに、その直接のクラス名だけでなく(たとえば、Helper::Monkeyisaの場合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の提案には多くのメリットがあると思いますが、代わりにこの方法を使用する場合は、すべてのベースをカバーすることをお勧めします。

于 2010-03-14T00:39:36.647 に答える
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' );
于 2010-03-13T23:57:46.377 に答える
0

これでいいと思います。

use Moose;
use Moose::Util::TypeConstraints;

my $animal = Moose::Meta::TypeConstraint->new(
    constraint => sub { $_[0] =~ /^Animal::/}
);

has animal => (is => 'rw', isa => $animal);

ETA: 私は jrockway に同意します。他に説得力のある理由がない限り、継承を使用する必要があります。

于 2010-03-13T22:52:20.620 に答える