Perl 6继承Array类时属性默认值不生效的问题及解决方法
为什么继承Perl 6的Array类时属性默认值不生效?
核心原因
Perl 6的内置容器类(比如Array、Hash)的new方法实现特殊,并未遵循常规类构造流程。当调用A.new: 1..10时,实际执行的是Array的new方法,它直接创建并返回底层数组实例,完全绕过了子类A的属性初始化逻辑——包括属性默认值赋值、BUILD和TWEAK子方法的执行。这就导致子类A中定义的$.member属性从未被初始化,最终输出Any。
自定义new方法生效的原理
你后来实现的自定义new方法之所以能解决问题,核心逻辑是:
- 通过
callsame调用父类Array的new方法,获取到数组实例 - 这个实例本质上是子类A的对象(Perl 6中父类构造返回的对象会自动绑定到子类类型)
- 手动执行
$instance.member = 42,补做了原本应该在属性初始化阶段完成的赋值操作
另外,给$.member添加is rw是因为需要在构造完成后修改属性值,如果仅需读取属性则无需该修饰符,但这里必须通过赋值初始化,因此必须加上。
内容的提问来源于stack exchange,提问作者fingolfin
相关产品推荐
相关产品推荐

