为BUILD对象的BUILD移相器中的属性赋值

jjm*_*elo 5 oop perl6

BUILD相位器被调用时,它会覆盖Perl6默认属性分配.假设我们必须使用BUILD移相器,就像我们在这个模块中那样(那是我遇到这个问题的地方).在该阶段为属性分配值的方式是什么?我用过这个

class my-class {
    has $.dash-attribute;

    submethod BUILD(*%args) {
        for %args.kv -> $k, $value {
            self."$k"( $value );
        }
    }
};

my $my-instance = my-class.new( dash-attribute => 'This is the attribute' );
Run Code Online (Sandbox Code Playgroud)

我得到了这个错误

Too many positionals passed; expected 1 argument but got 2
Run Code Online (Sandbox Code Playgroud)

其他组合$!$.,直接赋值,将属性声明为rw(相同错误)会产生不同类型的错误.这可能只是一个语法问题,但我找不到解决方案.任何帮助将不胜感激.

Eli*_*sen 5

你的例子中有两个错误,就像我看到的那样.首先,如果您希望属性可写,则需要对其进行标记is rw.其次,更改属性的值是通过赋值完成的,而不是通过将新值作为参数来完成.

所以我认为代码应该是:

class my-class {
    has $.dash-attribute is rw;

    submethod BUILD(*%args) {
        for %args.kv -> $k, $value {
            self."$k"() = $value;
        }
    }
};

my $my-instance = my-class.new( dash-attribute => 'attribute value' );
dd $my-instance;
# my-class $my-instance = my-class.new(dash-attribute => "attribute value")
Run Code Online (Sandbox Code Playgroud)

  • 这是Perl 6语法,表示您要调用名称在变量`$ k`中的方法.比较:`说Int.new; 使用`say Int."#"##`#"引用的方法名称需要带括号的参数.如果你想连接两个字符串,请使用'〜'.`和`say Int."new"()#0 (2认同)