这个问题是in the same ballpark as this other on making blocks iterable ,但似乎揭示了 mixins 的不同问题(或者我对语法的不同误解)。什么Iterable
所做的就是使数据结构有效地可迭代,也就是说,您可以通过在其前面添加 for
来创建循环。
Iterable serves as an API for objects that can be iterated with the for construct and related iteration constructs, like hyper operators.
所以让我们尝试将其付诸实践:
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}
,但仍然不高兴。必须直接调用迭代器。知道如何解决这个问题吗?
最佳答案
我认为你做不到。基本问题是 &foo
(Callable
对象)和 foo()
(调用 Callable
对象)是两个截然不同的事情。
我觉得您正在尝试向类
添加方法
,但您正在使用Sub
。
您需要在logger
的返回值上混合iterator
方法。由于我不太明白你想要实现什么目标,所以很难回答这个问题。
看看您显然想要实现的结果,我想出了这个:
my %store;
multi sub logger() {
%store
}
multi sub logger($event) {
%store{ DateTime.new( now ) } = $event;
}
logger( "One" );
logger( "Two" );
.say for logger;
但这根本不使用角色
。所以这可能不是您想要的。
关于mixins - for什么时候调用迭代器方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50580476/