mixins - for 什么时候调用迭代器方法?
问题描述
这个问题与其他关于使块可迭代的问题相同,但似乎揭示了 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;
我猜这表明该角色实际上正在工作,并且混入其中。由于 for 的类型&logger
是Block+{Forable}
,如果 Iterable 没有直接混入,它可能不起作用。事实上,does Iterable
从Forable
声明中删除不会以任何方式影响它。让我们试试这个:
&logger does (Iterable,Forable);
现在的类型&logger
显示为Block+{Iterable,Forable}
,但仍然没有喜悦。iterator
必须直接调用。关于如何解决这个问题的任何想法?
解决方案
我不认为你可以。基本问题是&foo
(Callable
对象)和foo()
(调用Callable
对象)是两个非常不同的东西。
对我来说,您正在尝试将 a 添加method
到 a class
,但您正在使用 a Sub
。
您需要iterator
在 的返回值上混合该方法logger
。由于我不太了解您要达到的目标,因此很难回答这个问题。
看着你显然想要达到的结果,我想出了这个:
my %store;
multi sub logger() {
%store
}
multi sub logger($event) {
%store{ DateTime.new( now ) } = $event;
}
logger( "One" );
logger( "Two" );
.say for logger;
但这根本不使用role
s 。所以这可能不是你想要的。
推荐阅读
- c++ - 从主函数中的源读取函数变量而不传递严格的值
- sqlalchemy - 如何在 sqlalchemy 中创建 NOT NULL 自引用外键
- c# - 如何正确重命名域中的机器?
- javascript - 如何获取javascript列表的第n项
- flutter - 在颤振中使用带有 WidgetSpan 的 TextSpan 时转移到换行符
- asp.net-mvc - 从 mvc 中的 Html.Grid 的下拉列表中获取选定的值
- verilog - 由于这段verilog代码,合成卡住并且没有完成......有什么想法吗?
- javascript - 电子邮件登录是否需要(firebase 9)initializeApp()?
- build - Babel-Plugin 常见 js 错误:'default' 不是由 node_modules/invariant/invariant.js 导出的,
- python - “IndexError:列表分配索引超出范围”分配给空列表中的索引