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声明中删除Iterable并不会以任何方式影响它.我们试试吧:
&logger does (Iterable,Forable);
现在& logger的类型显示为Block {Iterable,Forable},但仍然没有乐趣.迭代器必须直接调用.关于如何解决这个问题的任何想法?
解决方法
When does
for
call the iterator method?
据我所知,如果迭代功能的(single)参数是标量容器,那么它使用容器中的值而不调用.iterator.否则,它会调用.iterator,如果它是表达式或例程调用则先评估它.
&logger does Forable; .say for &logger;
This simply does not work;
say
is applied to&logger
as a simple item.
&是一个标记Callable的名词标记(sigil),它本身就是一个单一的东西,一个代码块.
更具体地说,& logger绑定到一个Scalar容器,其类型为Callable,与$logger(带有$sigil)完全相同,如果你编写了我的Callable $logger:
say .WHAT,.VAR,.VAR.WHAT,.VAR.of for my &logger,my Callable $logger
显示:
(Callable)Callable(Scalar)(Callable) (Callable)Callable(Scalar)(Callable)
Since the type for
&logger
isBlock+{Forable}
这实际上是绑定到& logger的Scalar容器中包含的Callable的类型.
它不是& logger容器本身的类型,它是一个Scalar,如上所示.
当以变量的形式给出单个参数时,迭代功能,例如查看变量,而不是变量中包含的值,以查看它是否是Iterable.标量不是可迭代的.
Any idea on how to solve this?
有关一种方法,请参阅lizmat的答案.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。