、新しいは、フル機能のコンストラクタで、ははミニマリストコンストラクタで祝福。 doco on blessを引用する
、新しいより...
低レベルオブジェクトの工法である祝福。 invocantと同じ型の新しいオブジェクトを作成し、名前付き引数を使用して属性を初期化し、作成したオブジェクトを返します。
class Point {
has $.x;
has $.y;
multi method new($x, $y) {
self.bless(:$x, :$y);
}
}
my $p = Point.new(-1, 1);
新しいクラスの(初期化+作成)新しいオブジェクトを構築するため...
デフォルトの方法であるのに対し、...:カスタムコンストラクタを書くとき あなたは、このメソッドを使用することができます。このメソッドは名前付き引数のみを必要とし、同じ名前のアクセサで属性を初期化するために使用されます。クラスは、このデフォルトをオーバーライドする独自の新しいメソッドを提供することがあります。
新は、彼らが存在する場合、継承階層の各クラスにBUILDという名前のサブメソッドを呼び出すオブジェクト構築のメカニズムをトリガします。詳細については、docmentation on object constructionを参照してください。
完全なストーリーを得るにはオブジェクト構築に関するドキュメントを参照してください。ただし、重要なビットは次のとおりです。
Mu.newは、方法は、すべての名前付き引数を渡し、そのインボカントに祝福を呼び出します。 blessは新しいオブジェクトを作成し、その上でメソッドBUILDALLを呼び出します。 BUILDALLはすべてのサブクラスを逆のメソッド解決の順番(すなわち、Muからほとんどの派生クラスまで)で歩き、各クラスでBUILDという名前のメソッドの存在をチェックします。存在する場合は、それが呼び出され、newメソッドからすべての名前付き引数を再度渡します。
この回答の以前のバージョンでは、私はblessが上記のsubmethod BUILDを呼び出すクラス階層を通過しないことを明言しました。これはfalseです。 .blessも同じことをしています。
だから、いつ他のものを使いますか?ムークラスによって提供されるデフォルト.newが希望コンストラクタでない場合は、オブジェクトを構築するために、次にあなたが属性を初期化し、それらを実行するために進行する.blessを呼ぶだろう、あなたのクラスでmethod new
を宣言しますデフォルト以外のタスク.newは行いません。 (カスタマイズ)インターフェースの一部であるnew
一方インフラとしてbless
の
「エッセンス」が正しくないと思います。 「正しい順序で、親クラスに属するすべての属性を初期化する」は、実際にどのような祝福が行われるかです。デフォルトの "new"メソッドは、渡されたすべての名前付き引数でblessを呼び出すだけです。 – timotimo
実験後、あなたは正しいです。それを指摘してくれてありがとう - 私の重要な "ブーイング・ステア"。私は私の答えを更新します。 – Marty