这个新问题是我之前提出的问题的后续问题,是在我充实内容时出现的。请注意,我也做了一些研究,并且有意识地避开了这里提到的 Scalar Mixins bug 。因此,我将角色混合到对象中,而不是标量容器中。
大局是进行数学运算,同时也执行简单的误差计算。
这是我的失败代码的简洁版本:
1 role Error {
2 has $.abs-error
3 }
4
5 multi prefix:<-> ( Error:D $x ) is default {
6 # - $x; # fails - enters an infinite loop
7 # - $x.Real; # fails - does not drop the Error mixin
8 ( 0 - $x ) does Error($x.abs-error) # works - but relies on the infix:<-> form
9 }
10
11 my $dog = 12.5 does …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用EnumerationPerl 6中的角色的一个示例(作为修复文档问题的一部分,枚举角色未记录).我想出了这个简单的例子:
class DNA does Enumeration {
my $DNAindex = 0;
my %pairings = %( A => "T",
T => "A",
C => "G",
G => "T" );
method new( $base-pair where "A" | "C" | "G" | "T" ) {
self.bless( key => $base-pair,
value => %pairings{$base-pair},
index => 33);
}
multi method gist(::?CLASS:D:) {
return "$!key -> $!value with $!index";
}
}
for <A C G T>.roll( 16 ) -> $letter …Run Code Online (Sandbox Code Playgroud) 这个例子是采取从roast,虽然它已经有8年了:
role doc { has $.doc is rw }
multi trait_mod:<is>(Variable $a, :$docced!) {
$a does doc.new(doc => $docced);
}
my $dog is docced('barks');
say $dog.VAR;
Run Code Online (Sandbox Code Playgroud)
这将返回Any,而不会混入任何角色。尽管特质不会出错,但显然没有办法进入“ doc”部分。任何的想法?
这个问题与其他关于使块可迭代的问题在同一个问题上,但似乎揭示了mixins的一个不同问题(或者对我的语法有不同的误解).什么Iterable是使数据结构有效迭代,也就是说,你可以通过在它之前创建循环for.
Iterable用作对象的API,可以使用for构造和相关的迭代构造(如超运算符)进行迭代.
所以让我们尝试将其付诸实践:
my &logger = -> $event {
state %store;
if ( $event ) {
%store{ DateTime.new( now ) } = $event;
} else {
%store;
}
}
role Forable does Iterable {
method iterator(&self:) {
self( Nil );
}
}
logger( "One" );
logger( "Two" );
&logger does Forable;
.say for &logger;
Run Code Online (Sandbox Code Playgroud)
这根本行不通; say应用于&logger一个简单的项目.但是,如果我们将最后一句改为:
.say for &logger.iterator;
Run Code Online (Sandbox Code Playgroud)
我猜这表明该角色实际上正在工作,并且混入.由于类型为&loggeris Block+{Forable},如果Iterable没有直接混合,它可能不起作用.事实上,does Iterable从 …