Raku中无需BUILD子方法设置必填私有属性,当前或未来是否可行?
在Raku中不编写BUILD子方法能否设置必填私有属性?
当前Raku中无法直接在不编写BUILD子方法的情况下设置必填私有属性,同时非必填私有属性通过new传参初始化也会被静默忽略——这是因为对象构造阶段,只有公共属性(带.访问器的属性)能自动映射到构造参数,私有属性(以$!开头)不具备这种自动关联能力。
问题验证示例
1. 必填私有属性的报错场景
直接尝试通过构造参数初始化必填私有属性会触发错误:
class C { has Str:D $!name is required; } C.new: name => 'Roger';
报错提示:
The attribute '$!name' is required, but you did not provide a value for it.
2. 非必填私有属性的静默忽略
非必填私有属性通过构造传值不会生效,初始化操作被直接忽略:
class C { has Str $!name; method say { $!name.say } } .say with C.new: name => 'Roger';
输出结果:
(Str)
关于官方文档的补充说明
官方文档“Attributes”章节提到is required trait用于确保属性在对象创建时被设置,但实际生效逻辑是:仅公共属性无需编写BUILD就能自动通过构造参数赋值,私有属性因设计为类内部专属访问,构造阶段不会自动关联外部传入的参数。
简化解决方案
如果不想手动编写完整的BUILD子方法,可以给私有属性添加is param trait,它会自动生成构造参数的处理逻辑,实现私有属性的初始化:
class C { has Str:D $!name is required is param; } C.new: name => 'Roger'; # 正常运行
内容的提问来源于stack exchange,提问作者zjmarlow
相关产品推荐
相关产品推荐

