Perl6中BUILD阶段属性赋值方法及报错问题咨询
解决Perl 6中BUILD阶段属性赋值的问题
你遇到的报错(应该是Too many arguments passed to method 'dash-attribute'),核心原因是默认的公共属性($.前缀)是只读的,Perl 6不会为它生成setter方法。当你尝试调用self."$k"( $value )时,其实是在给只读的getter方法传参数,自然会报错参数过多。
下面给你两种可行的解决办法,根据你的需求选择:
方法1:将属性设为可写(保留公共访问器)
如果这个属性需要对外暴露可写的接口,只需要给属性加上is rw trait,这样Perl 6会自动生成setter方法,你的原有逻辑就能正常工作:
class MyClass { has $.dash-attribute is rw; # 添加is rw使其可写 submethod BUILD(*%args) { for %args.kv -> $k, $value { self."$k"( $value ); } } } my $my-instance = MyClass.new( dash-attribute => 'This is the attribute' ); say $my-instance.dash-attribute; # 输出: This is the attribute
方法2:直接访问底层属性变量(保持属性只读)
如果这个属性不需要对外可写,只是需要在BUILD阶段初始化,更安全的方式是直接访问属性的底层变量(用!前缀),这样不需要依赖setter方法,也能避免对外暴露写接口:
class MyClass { has $.dash-attribute; # 保持只读 submethod BUILD(*%args) { for %args.kv -> $k, $value { # 将属性名的连字符转为底层变量名(Perl 6会自动将$.dash-attribute转为!dash-attribute) my $private-name = "!$k"; self."$private-name" = $value; } } } my $my-instance = MyClass.new( dash-attribute => 'This is the attribute' ); say $my-instance.dash-attribute; # 输出: This is the attribute # 尝试修改会报错: Cannot assign to a readonly variable or a value # $my-instance.dash-attribute = "New value";
额外补充一点:其实Perl 6的BUILD阶段会自动处理%args中的属性赋值,除非你显式定义了BUILD方法才会覆盖这个默认行为。如果你只是想在BUILD里做额外逻辑,同时保留默认的属性赋值,可以调用nextsame来继承默认行为:
class MyClass { has $.dash-attribute; submethod BUILD(*%args) { nextsame; # 先让Perl 6完成默认的属性赋值 # 这里添加你的额外初始化逻辑 say "Attribute initialized to: $.dash-attribute"; } } my $my-instance = MyClass.new( dash-attribute => 'This is the attribute' );
这样就不用手动遍历%args赋值了,更简洁也不容易出错。
内容的提问来源于stack exchange,提问作者jjmerelo
相关产品推荐
相关产品推荐

