Raku中has声明符搭配解构赋值的属性默认值问题咨询
回答
1. 关于has是否支持批量解构式声明
这种用括号包裹、一次声明多个类属性的写法是Raku语法设计中允许的签名式属性声明,和my/our的解构赋值复用了同一套列表解析逻辑,并非意外生效的非正式语法。只是目前官方文档还未补充这部分用法的说明。
你提到的无默认值的批量类型属性声明class User { has (Str $.first-name, Str $.last-name, Int $.age) }当前已经可以正常使用,属性的类型约束、访问器生成逻辑都和分开声明完全一致。
2. 关于默认值失效的问题
你观察到的两个现象:默认值不生效、交换属性位置会触发「必选参数不能放在可选参数之后」的报错,结合起来已经说明:编译器确实识别到了括号内的默认值标记,会把带=的属性判定为可选,遵循参数签名的语法规则;但默认值没有被正确绑定到属性的初始化逻辑中,这是当前Rakudo编译器的实现缺陷,并非语法设计的预期行为。
目前这个问题已经被收录到Raku的待修复列表中,后续版本会实现默认值的正确绑定。如果需要在当前版本实现带默认值的批量声明,可以使用临时兼容写法:
class D { has ($.a, $.b); submethod BUILD(:$!a, :$!b = 42) {} } D.new(:a<foo>); # 输出 D.new(a => "foo", b => 42)
内容的提问来源于stack exchange,提问作者codesections
相关产品推荐
相关产品推荐

