Perl5 のほとんどのものと同様に、属性のカスタム型強制をサポートするクラスを作成する方法はたくさんあります。配列参照からハッシュへの単純なものを次に示します。
#!/usr/bin/env perl
package Local::Class {
use Moo;
use Types::Standard qw( HashRef ArrayRef );
has set => (
is => 'ro',
coerce => 1,
isa => HashRef->plus_coercions(
ArrayRef, sub { return { map { $_ => 1} @{$_[0]} } },
),
);
}
my $o = Local::Class->new({ set => [qw( a b b c )] });
# $o->set now holds { a => 1, b => 1, c => 1}
私はこのようなものを Perl6 に移植しようとしてきましたが、必要なのは anArray
を aに強制する方法のようSetHash
です。これまでのところ、私がそれを行うことができた唯一の方法は次のとおりです。
#!/usr/bin/env perl6
class Local::Class {
has %.set;
## Wanted to have
# has %.set is SetHash;
## but it dies with "Cannot modify an immutable SetHash"
submethod TWEAK (:$set) {
self.set = $set.SetHash;
}
}
my $o = Local::Class.new( set => [< a b b c >] );
# $o.set now holds {:a, :b, :c}
しかし、これは正しい方法ではないように思えます。少なくとも、奇数番号のリストをコンストラクターに渡すとスクリプトが死んでしまうという細かい点についてはそうです。
では、これは Perl6 でどのように行われるのでしょうか? クラス属性のカスタム型強制を実装するための推奨される方法は何ですか (複数あると確信しているため)。