パッケージのサブルーチンコールとクラスのメソッド起動
Perlでは、パッケージのサブルーチンコールとクラスのメソッド起動は、実は、ほぼ同じものなのです。
まず、パッケージは、OO的にはクラスを表します。
また、パッケージのサブルーチンは、OO的にはメソッドを表します。
サブルーチンコールとメソッド起動では、ほぼ同じなのですが、引数の解釈が少し異なります。
それは、メソッド側では、第一引数が必ず、クラス名か、またはオブジェクトリファレンスになるのです。
では、それを見ていきましょう。
まず、以下のようにCarパッケージ(クラス)にnewサブルーチン(メソッド)があるとします。
# Carパッケージ(クラス) package Car; # newサブルーチン(メソッド) sub new { my $this = shift; my ($color, $name, $cc) = @_; my $car = { color => $color, name => $name, cc => $cc, }; return bless $car, $this; }
メインパッケージからnewを呼ぶ場合
サブルーチンでは、頭に『パッケージ名::』で修飾します。
my $mycar = Car::new('Car', 'Green', 'セレナ', 2000);
または、括弧が省略可能です。
my $mycar = Car::new 'Car', 'Green', 'セレナ', 2000;
メソッドでは、頭に『パッケージ名->』で修飾します。(矢印形式)
my $mycar = Car->new('Green', 'セレナ', 2000);
または、メソッド名を後からパッケージ名で修飾します。(間接オブジェクト形式)
my $mycar = new Car 'Green', 'セレナ', 2000;
サブルーチンとメソッドの違いは、第一引数にクラス名(パッケージ名)を指定するかいなかです。
また、メソッドの場合は、メインパッケージにnew名やCar名のサブルーチンがたまたまある場合は、そちらが優先されます。
特に間接オブジェクト形式は、JavaやVBでのnewと見た目が同じでいい感じなのですが、でも私は、矢印形式の方をお奨めします。
理由は以下を参照してください。