微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

mixins – 什么时候调用迭代器方法?

这个问题是 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声明中删除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 is Block+{Forable}

这实际上是绑定到& logger的Scalar容器中包含的Callable的类型.

它不是& logger容器本身的类型,它是一个Scalar,如上所示.

当以变量的形式给出单个参数时,迭代功能,例如查看变量,而不是变量中包含的值,以查看它是否是Iterable.标量不是可迭代的.

Any idea on how to solve this?

有关一种方法,请参阅lizmat的答案.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐