加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-16 06:23:52 所属栏目:大数据 来源:网络整理
导读:这个问题是 in the same ballpark as this other on making blocks iterable,但似乎揭示了mixins的一个不同问题(或者对我的语法有不同的误解). Iterable 的作用是使数据结构有效地可迭代,也就是说,你可以通过在for前面创建循环来创建循环. Iterable serves a
这个问题是 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的答案.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读