mixins – 什么时候调用迭代器方法?
这个问题是
in the same ballpark as this other on making blocks iterable,但似乎揭示了mixins的一个不同问题(或者对我的语法有不同的误解).
Iterable 的作用是使数据结构有效地可迭代,也就是说,你可以通过在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声明中删除Iterable并不会以任何方式影响它.我们试试吧: &logger does (Iterable,Forable); 现在& logger的类型显示为Block {Iterable,Forable},但仍然没有乐趣.迭代器必须直接调用.关于如何解决这个问题的任何想法? 解决方法
据我所知,如果迭代功能的(single)参数是标量容器,那么它使用容器中的值而不调用.iterator.否则,它会调用.iterator,如果它是表达式或例程调用则先评估它. &logger does Forable; .say for &logger;
&是一个标记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)
这实际上是绑定到& logger的Scalar容器中包含的Callable的类型. 它不是& logger容器本身的类型,它是一个Scalar,如上所示. 当以变量的形式给出单个参数时,迭代功能,例如查看变量,而不是变量中包含的值,以查看它是否是Iterable.标量不是可迭代的.
有关一种方法,请参阅lizmat的答案. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |