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

时间:2018-03-17 09:58:48

标签: oop perl6

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

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' );

我收到此错误

Too many positionals passed; expected 1 argument but got 2

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

2 个答案:

答案 0 :(得分: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")

答案 1 :(得分:4)

你可以像对象系统通常一样为你做这件事。
(不推荐)

class C {
  has $.d;

  submethod BUILD ( *%args ){
    for self.^attributes {
      my $short-name = .name.substr(2); # remove leading 「$!」
      next unless %args{$short-name}:exists;
      .set_value( self, %args{$short-name} )
    }
  }
}

say C.new(d => 42)
C.new(d => 42)