class Submethod is Routine {}

子类不会继承子方法。它们通常用于每个类的初始化和终止任务,这些任务在继承树中针对每个类显式调用,通常是为了强制执行特定顺序。例如,使用 BUILD 子方法的对象构造从最不派生的到最派生的发生,以便最派生的(子)类可以依赖于父类已经初始化。

子方法的类型为 Submethod,并使用 submethod 声明符声明

class Area {
    has $.size;
    submethod BUILD(:$x:$y:$z{
        $!size = $x * $y * $z;
    }
}

由于子方法不会被继承,一个有趣的用例恰好是将从标准子方法(例如 BUILDTWEAK)调用的方法。

class Hero {
    has @.inventory;
    has Str $.name;
    submethod BUILD:$!name:@!inventory ) {
        @!inventory = self.clean-inventory@!inventory );
    }
    submethod clean-inventory@inventory ) {
        @!inventory.unique.sort
    }
}
 
my Hero $þor .= newname => "Þor",
                     inventory => ( "Mjölnir""Megingjörð""Mjölnir" ) );
say $þor.inventory;
# OUTPUT: «[Megingjörð Mjölnir]␤» 

仅在调用它的子方法的特定上下文中调用这些方法才有意义。

方法§

方法 gist§

multi method gist(Submethod:D:)

返回子方法的名称。

类型图§

Submethod 的类型关系
raku-type-graph Submethod Submethod Routine Routine Submethod->Routine Mu Mu Any Any Any->Mu Callable Callable Code Code Code->Any Code->Callable Block Block Block->Code Routine->Block

展开上面的图表