像 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 中完成的呢?为类属性实现自定义类型强制的推荐方法是什么(因为我确定不止一种)?