在 BUILD 移相器中为对象的属性赋值
Assigning values to attributes in the BUILD phaser for an object
当调用 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
(同样的错误)会产生不同类型的错误。这可能只是一个语法问题,但我找不到解决方案。任何帮助将不胜感激。
在我看来,您的示例中有两处错误。首先,如果你想要一个属性是可写的,你需要将它标记为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")
您可以按照对象系统通常在后台为您执行的方式来执行此操作。
(不推荐)
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)
当调用 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
(同样的错误)会产生不同类型的错误。这可能只是一个语法问题,但我找不到解决方案。任何帮助将不胜感激。
在我看来,您的示例中有两处错误。首先,如果你想要一个属性是可写的,你需要将它标记为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")
您可以按照对象系统通常在后台为您执行的方式来执行此操作。
(不推荐)
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)