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

标签 mixins raku

这个问题是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 声明中删除 does Iterable 不会以任何方式影响它。让我们试试这个:

&logger does (Iterable,Forable);

现在&logger的类型显示为Block+{Iterable,Forable},但仍然不高兴。必须直接调用迭代器。知道如何解决这个问题吗?

最佳答案

我认为你做不到。基本问题是 &foo (Callable 对象)和 foo() (调用 Callable 对象)是两个截然不同的事情。

我觉得您正在尝试向添加方法,但您正在使用Sub

您需要在logger的返回值上混合iterator方法。由于我不太明白你想要实现什么目标,所以很难回答这个问题。

看看您显然想要实现的结果,我想出了这个:

my %store;
multi sub logger() {
    %store
}
multi sub logger($event) {
    %store{ DateTime.new( now ) } = $event;
}

logger( "One" );
logger( "Two" );

.say for logger;

但这根本不使用角色。所以这可能不是您想要的。

关于mixins - for什么时候调用迭代器方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50580476/

相关文章:

variable-assignment - Perl6 REPL打印行为

javascript - 在 mixin 中使用 vue-router

code-generation - 使用Raku计算e数

raku - 如何从函数传递指向容器的指针?

ruby - 在 Ruby 中,当没有正确的英语 "<verb>able"时,mixins 的命名约定是什么?

raku - Perl6 安装的模块

asynchronous - 超时的用户输入无法按预期工作

javascript - 如何使用 Vue.js mixins 替换字符串值?

ReactJS Reflux 在 ES6 中使用 mixin

django - 同时使用 LoginRequiredMixin 和 UserPassesTestMixin