【发布时间】:2018-11-07 21:07:15
【问题描述】:
这个问题是in the same ballpark as this other on making blocks iterable,但似乎揭示了 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;
这根本行不通; say 作为一个简单的项目应用于&logger。但是,如果我们将最后一句更改为:
.say for &logger.iterator;
我猜这表明该角色实际上正在工作,并且混入其中。由于&logger 的类型是Block+{Forable},如果不直接混入Iterable,它可能不起作用。事实上,从Forable 声明中删除does Iterable 不会以任何方式影响它。让我们试试这个:
&logger does (Iterable,Forable);
现在&logger的类型显示为Block+{Iterable,Forable},但仍然没有喜悦。 iterator 必须直接调用。关于如何解决这个问题的任何想法?
【问题讨论】: