【问题标题】:Mixing roles into callables将角色混合到可调用对象中
【发布时间】:2018-11-07 18:39:42
【问题描述】:

理论上,你可以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

我真的不知道谁在期待 1 个参数。从理论上讲,它应该是CALL-ME 函数,但谁知道呢。消除self. 会产生不同的错误:CALL-ME used at line 11。将does Callable 添加到Argable (将self 放回后)会导致相同的错误。这可以做到吗?知道怎么做吗?

【问题讨论】:

    标签: mixins raku


    【解决方案1】:

    您的代码中有两处不正确:

    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;
    

    【讨论】:

      猜你喜欢
      • 2018-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-17
      • 2017-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多