mixins – 将角色混合成可调用角色

从理论上讲,你可以 mix in a role into an object in runtime.所以我试着用一个函数做到这一点:

my &random-f = -> $arg  { "Just $arg" };

say random-f("boo");

role Argable {
    method argh() {
        self.CALL-ME( "argh" );
    }
}

&random-f does Argable;

say random-f.argh;

在角色中,我使用self来引用已定义的函数,并使用CALL-ME来实际调用角色中的函数.但是,这会导致以下错误

Too few positionals passed; expected 1 argument but got 0
in block <unit> at self-call-me.p6 line 5

我真的不知道谁会期待一个论点.从理论上讲,它应该是CALL-ME功能,但谁知道呢.消除自我.产生一个不同的错误:在第11行使用CALL-ME.添加Callable到Argable(放回自我后)导致相同的错误.可以这样做吗?怎么想?

解决方法

您的代码中有两个不正确的内容

say random-f.argh;  # *call* random-f and then call .argh on the result

你想在Callable上调用.argh:

say &random-f.argh;

其次,你应该能够调用self:你可以在.argh方法的签名中调整它:

method argh(&self:) {

所以最终的代码变成:

my &random-f = -> $arg  { "Just $arg" };

say random-f("boo");

role Argable {
    method argh(&self:) {
        self( "argh" );
    }
}

&random-f does Argable;

say &random-f.argh;

相关文章

1. 如何去重 #!/usr/bin/perl use strict; my %hash; while(...
最近写了一个perl脚本,实现的功能是将表格中其中两列的数据...
表的数据字典格式如下:如果手动写MySQL建表语句,确认麻烦,...
巡检类工作经常会出具日报,最近在原有日报的基础上又新增了...
在实际生产环境中,常常需要从后台日志中截取报文,报文的形...
最近写的一个perl程序,通过关键词匹配统计其出现的频率,让...