メソッドを呼び出す方法には 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.