30

OO Perl とmy $self = shift;これらの個々の要素に関するドキュメントは素晴らしいものですが、それらがどのように連携するかについて触れているものはどれも見つかりませんでした。

私は Moose を使用して属性を持つモジュールを作成してきましたが、もちろん、そのモジュール内でモジュールの属性を参照すると便利です。my $self = shift;モジュールの属性をその変数に割り当てるために、サブルーチン内で使用するように何度も言われてきました。これは理にかなっていて機能しますが、引数もサブルーチンに渡すと、このプロセスは明らかに配列の最初の要素を取得し、それを同様@ARGVに割り当てます。$self

Shift を使用してモジュールの属性への内部アクセスを取得し、@ARGV配列に引数を渡す方法について誰かが説明できますか?

4

3 に答える 3

63

まず、サブルーチンは@ARGV配列に渡されません。むしろ、サブルーチンに渡されるすべてのパラメーターは、サブルーチン内で表される単一のリストにフラット化され@_ます。@ARGV 配列は、スクリプトに渡されるコマンド ライン引数を含む、スクリプトの最上位で使用できます。

現在、Perl では、オブジェクトのメソッドを呼び出すと、オブジェクトは暗黙的にパラメーターとしてメソッドに渡されます。

継承を無視すると、

 $obj->doCoolStuff($a, $b);

と同等です

 doCoolStuff($obj, $a, $b);

つまり、@_メソッドの内容は次のdoCoolStuffようになります。 @_ = ($obj, $a, $b);

現在、shift組み込み関数は、パラメーターなしで、要素をデフォルトの配列変数からシフトアウトします@_。この場合、それは になります$obj

あなたがそうするとき$self = shift、あなたは効果的に言ってい$self = $objます。

->また、これにより、表記法を介してメソッドに他のパラメーターを渡す方法が説明されることを願っています。上記の例を続けると、次のようになります。

sub doCoolStuff {
  # Remember @_ = ($obj, $a, $b)
  my $self = shift;
  my ($a, $b) = @_;

さらに、 Perl の優れたオブジェクト レイヤーですが、各メソッドで自分自身Mooseを初期化する必要があるという要件がなくなるわけではありません。$selfこれを常に覚えておいてください。C++ や Java などの言語はオブジェクト参照thisを暗黙的に初期化しますが、Perl では、作成するメソッドごとに明示的に初期化する必要があります。

于 2013-10-03T14:33:32.763 に答える
2

あなたが呼び出す場合:

$myinstance->myMethod("my_parameter");  

することと同じです:

myMethod($myinstance, "my_parameter");  

しかし、もしそうなら:

myMethod("my_parameter");  

「my_parameter」のみが渡されます。

THEN myMethod 内で常に行う場合:

 $self = shift @_;  

$self は、myMethod id がオブジェクト コンテキストから呼び出された場合のオブジェクト参照になります
が、手続き的な方法で内部の別のメソッドから呼び出された場合は "my_parameter" になります。
これに注意してください。

于 2014-03-03T00:19:02.083 に答える