Go to the first, previous, next, last section, table of contents.


メソッド呼び出し

メソッドを呼び出す方法には 2 つあり、その1つは既になじみの深いものですし、 もう1つは見たことのある格好をしています。Perl 4 は、既に

print STDERR "help!!!\n";

としたときに使われる、「間接オブジェクト」構文を持っていました。

この同じ構文が、静的メソッドにも仮想メソッドにも使われます。先に定義した 2つのメソッド、オブジェクトリファレンスを検索するための静的メソッド、そ の属性を出力するための仮想メソッドを使ってみましょう。

$fred = find Critter "Fred";
display $fred 'Height', 'Weight';

これらは、間接オブジェクトのところに BLOCK を使って、1 つの文に組み合わ せることができます:

display {find Critter "Fred"} 'Height', 'Weight';

C++ ファンのために、同じことをする -> を使った構文も用意してあり ます。引数がある場合には、括弧が必要です。

$fred = Critter->find("Fred");
$fred->display('Height', 'Weight');

あるいは、1 文で、

Critter->find("Fred")->display('Height', 'Weight');

ある構文が読みやすいと感じることがあり、別の構文の方が読みやすいと感じる こともあります。間接オブジェクトの構文は、混乱させるようなものではありま せんが、通常のリスト演算子としての、同様の曖昧さも持っています。間接オブ ジェクトのメソッド呼び出しは、リスト演算子と同じ規則を使って解釈されます: 「関数のように見えれば、それは関数です。」(2つの並んだ単語が関数名のよう に見えると考えれば、です。C++ のプログラマは、特に最初の単語が new のときに、規則的にそのように考えるようです。)つまり、

new Critter ('Barney', 1.5, 70)

という括弧は、その後に何が来ようとも、メソッドに対するすべての引数を囲っ ているものとして扱われます。

new Critter ('Bam' x 2), 1.4, 45

と書くのは、

Critter->new('Bam' x 2), 1.4, 45

と同じことで、目的とは違うでしょう。

どのクラスのメソッドを使うかを指定したい場合もあります。その場合には、通 常のサブルーティン呼び出しとして、メソッドを呼び出すことができます。必須 の最初の引数は、明示的に渡さなければなりません:

$fred =  MyCritter::find("Critter", "Fred");
MyCritter::display($fred, 'Height', 'Weight');

しかしながら、この場合には継承を行ないません。単に Perl がメソッドの検索 を開始する特定のパッケージを指定したいだけならば、メソッド名にパッケージ 名を付けて、通常のメソッド呼び出しを使ってください:

$fred = Critter->MyCritter::find("Fred");
$fred->MyCritter::display('Height', 'Weight');


Go to the first, previous, next, last section, table of contents.

検索式: