燈明ブログ

現状は小池啓仁の応援ブログ

Perlでの『間接オブジェクト形式』とは

以下のつづきです。

以下のような形式でメソッドを起動することを『間接オブジェクトを使ったメソッドの起動』と言います。

METHOD INVOCANT (LIST)
METHOD INVOCANT LIST
METHOD INVOCANT

ちなみに、INVOCANT(インボカント)とは、パッケージ名(クラス名)または、オブジェクトを指すリファレンスです。
たとえば、newメソッド(インボカントはCar)とprintメソッド(インボカントはSTDERR)の場合は、以下の感じです。

$mycar = new Car('Green', 'セレナ', 2000);
print STDERR 'エラー情報1', "エラー情報2\n";

しかし、この『間接オブジェクト形式』には、2つの落とし穴あります。
1つ目は、他のリスト演算子と同じようにパースされるので、&&とandや||とorの優先順位の違いに注意が必要とされる。
たとえば、以下の感じ。

print STDERR "エラー情報\n" and exit(); # 『エラー情報』が表示される
print STDERR "エラー情報\n" && exit();  # 『エラー情報』が表示されない

2つ目は、INVOCANTに使えるのが、名前、添え字なしのスカラー変数、またはブロックだけに限られる。
たとえば、以下の感じ。

move $riders[$i];

は、

$riders[$i]->move;

でなく

$riders->move([$i]);

と解釈される。