2016-02-26 10 views
8
class Singleton { 
    # We create a lexical variable in the class block that holds our single instance. 
    my Singleton $instance = Singleton.bless; # You can add initialization arguments here. 
    method new {!!!} # Singleton.new dies. 
    method instance { $instance; } 
} 

私はSingleltonを実装する上記のコードを見つけましたが、私はPerl6のblessとnewの違いは何ですか?簡単に言えばperl6 blessとnewの違い

my Singleton $instance = Singleton.bless; 


my Singleton $instance = Singleton.new; 

答えて

4

新しいは、フル機能のコンストラクタで、はミニマリストコンストラクタで祝福。 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

+1

「エッセンス」が正しくないと思います。 「正しい順序で、親クラスに属するすべての属性を初期化する」は、実際にどのような祝福が行われるかです。デフォルトの "new"メソッドは、渡されたすべての名前付き引数でblessを呼び出すだけです。 – timotimo

+1

実験後、あなたは正しいです。それを指摘してくれてありがとう - 私の重要な "ブーイング・ステア"。私は私の答えを更新します。 – Marty

7

思います。

あなたはクラスMuimplementation(クラス・システムのルート)を見れば、あなたはblessが低レベルのコンストラクタ、nqp::createを呼び出し、その後、BUILDALLを呼び出し、呼び出すために継承チェーンを歩行することがわかりますオブジェクトを初期化する適切なメソッド(サブ)。デフォルトのnewでは、blessが呼び出されます。

だからnewを呼び出すblessを呼び出すBUILDALLBUILDを呼び出します。通常、blessBUILDALLのままにし、カスタマイズのためにnewBUILDを上書きする必要があります。また、名前newは単に規約に過ぎないことに注意してください。blessの呼び出しの他に特別な処理を行わない通常の方法です。

関連する問題