7

Moose::Manual::Attributesの状態:

[デフォルトの] サブルーチン参照を使用する代わりに、代わりに属性にビルダー メソッドを指定できます。 ... これにはいくつかの利点があります。まず、コードのチャンクを独自の名前付きメソッドに移動します。これにより、読みやすさとコード構成が向上します。

したがって、属性は次のようにデフォルトを定義できます。

has attr => (
  is => 'ro',
  builder => 'subroutine'
);
sub subroutine {
  # figure out and return default value
}

これをデフォルトとは別にする必要がある理由がわかりません。名前付きサブルーチンへの参照を渡すことはできませんか?

has attr => (
  is => 'ro',
  default => \&subroutine
);

存在しないサブルーチンを誤って参照しないことが保証されているので、それはより良いプログラミング手法ではないでしょうか? シンボリック参照ではなく、論理参照を使用してメソッドを参照することになります。

4

3 に答える 3

14

ビルダーが呼び出されると、次のことが起こります。

$object->$builder

builder が文字列 (たとえばbuild_attr) の場合、ユーザーは独自の build_attr メソッドをサブクラスに記述でき、それが呼び出されます。これにより、単純な名前付きメソッド メカニズムを介してデフォルト値を拡張できます。

サブルーチンへの参照である場合、参照は元のクラスのパッケージで取得されます。つまり、同じ方法でオーバーライドすることはできません。

于 2009-02-18T16:15:00.197 に答える
10

これは「シンボリック」参照ではありません。ビルダーはメソッドです。つまり、ロールから継承および構成可能です。サブルーチン参照を渡す場合、その参照は同じパッケージに存在する (または完全修飾されている) 必要があります。

説明書に書いてあるので間違いないです。不明ですか?

于 2009-02-18T16:14:48.417 に答える
7

サブクラス化。

Builder は呼び出すメソッド名を指定するので、

package Something;
use Moose;

extends 'YourClass';

sub subroutine { <some other default> }

'subroutine' のビルダーに対しては、Something::subroutine が呼び出されますが、subref スタイルを使用した場合は、代わりに YourClass::subroutine が呼び出されます。これは、メソッドを通過させるのではなく、サブルーチンへの直接参照を作成したためです。急送。

于 2009-02-18T16:15:35.717 に答える