与Perl5中的大多数情况一样,创建支持其属性的自定义类型强制的类的方法很多。这里有一个简单的,从一个数组引用散列:Perl6类属性中的类型强制
#!/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中完成的呢?推荐的方法是什么(因为我确定有不止一种方法)为类属性实现自定义类型强制?
我认为它实际上应该一起工作'有%.SET是SetHash;'为好,而“无法修改不可改变的SetHash “只是一个Rakudo错误。 – smls
@smls:同意; cf编辑 – Christoph
'子方法BUILD(SetHash():$ set){%!set:= $ set}'也适用 –