有人知道为什么TWEAK程序在BUILD程序之前被击中吗

  • 本文关键字:程序 BUILD TWEAK raku rakudo
  • 更新时间 :
  • 英文 :


最小代码:

#!/usr/bin/raku
class Widget {
submethod TWEAK(:$content, :$styles) {
say "t1n";
}
}
class File is Widget {
submethod BUILD() {
say "b1";
}
}
my $xml = File.new();

输出:

t1
b1

引用相关文档:

BUILD方法被调用后,名为TWEAK的方法是调用(如果存在(,再次使用已传递到新。

那么为什么TWEAKBUILD之前被击中?

我使用的是Fedora 32附带的Rakudo版本(Rakudo-0.200.02-1.fc32.x86_64(。

TWEAKBUILD方法添加到每个缺少它们的示例类的快速实验显示调用的顺序为Widget::BUILD->Widget::TWEAK->File::BUILD->File::TWEAK

所以我认为问题出在文件的措辞上;在BUILD方法被调用后,名为TWEAK的方法(如果存在(将被再次调用,并带有传递给new的所有命名参数">

我认为这可能是";为每个类调用BUILD方法后,为该类调用名为TWEAK的方法(如果存在(,并再次使用传递给new的所有命名参数">

这将记录下似乎正在发生的事情。

注意:由于回答了这个问题,文档已经更新,以反映代码是如何运行的。

TWEAKBUILD之后调用。

然而,子类仍然需要遵循其父类的构造例程。考虑以下代码:

class Foo {
submethod TWEAK { say "Foo tweak" }
submethod BUILD { say "Foo build" }
}
class Bar is Foo {
submethod TWEAK { say "Bar tweak" }
submethod BUILD { say "Bar build" }
}
Bar.new

如果你运行它,你可以很快看到发生了什么:

Foo build
Foo tweak
Bar build
Bar tweak

基本上,每个类的构造函数方法在为父类调用之前都不会被调用,这意味着在构建和调整时,都可以假设父类的属性已经正确初始化。

这实际上就是这些方法需要是子方法的原因,否则,如果父类的构建方法引用了私有属性,而子类继承了父方法,则会出现错误,因为它将为patent和child调用,但child将无权访问。

相关内容

最新更新