燈明ブログ

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

パッケージのサブルーチンコールとクラスのメソッド起動

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名のサブルーチンがたまたまある場合は、そちらが優先されます。


特に間接オブジェクト形式は、JavaVBでのnewと見た目が同じでいい感じなのですが、でも私は、矢印形式の方をお奨めします。
理由は以下を参照してください。