Как и большинство вещей в 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, где мне кажется, что мне нужен способ принуждения Array
к 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? Каковы рекомендуемые способы (потому что я уверен, что их несколько) для реализации приведения настраиваемого типа для атрибутов класса?