Perlテックブログ

ITエンジニアの成長意欲を刺激する技術考察、モジュール開発の日記。Perlイベントや国内や海外のPerlの記事の紹介。

「Perlコア」だけで実現する簡単に「クラス」を作る方法

Perlはクラスの仕組みがわかりにくいというご意見をいただいたので、Perlコアだけで、クラスを作成する方法を簡単に解説したい。


Perlのクラス構文はパラダイムが違う

Perlには、クラス構文がないのよ。だから、javaとかrubyから始めて、Perlを使うと、Perlには、クラス構文がないから、簡単に書けないと感じるのね。

Perlパラダイムでは、こうなります。

  • オブジェクトとは、データに名前空間を結びつけたもの

これが、Perlパラダイムにおける、オブジェクトの概念なの。

実はこのパラダイムは、Perlpythonからもらってきて、goが採用した考え方でもあるの。

補足的に、Perlオブジェクト指向の特徴をあげると次のようになります。

  • クラス宣言はない
  • コンストラクタはない
  • フィールドの宣言はない
  • アクセッサの生成構文はない

あらゆるものがありません。ドキュメントを探しても、どこにもありましぇーん。

Perlオブジェクト指向は、次の機能を使って実現します。

  • 名前空間」の宣言
  • newという名前のサブルーチン定義
  • ハッシュのリファレンスという「データ」
  • bless関数を使って、データと名前空間を結びつける

Pointクラスを書いてみる

Perlコアだけの機能を使ってPointクラスを書いてみます。

# 名前空間の宣言
package Point;

# newという名前のサブルーチン定義
sub new {
  # 第一引数はクラス名
  my $class = shift;

  # ハッシュのリファレンスという「データ」
  # デフォルト値に対応
  my $self = {
    x => 0,
    y => 0,
    @_,
  };
  
  # bless関数を使って、データと名前空間を結びつける
  bless $self, $class;

  # Pointオブジェクトを返却
  return $self;
}

# 読み込み専用のアクセッサだけ自力で書く
sub x { shift->{x} }
sub y { shift->{y} }

使う側。

my $point = Point->new(x => 1, y => 2);

my $x = $point->x;
my $y = $point->y;

意外とコンパクトには書けるでしょう?

オブジェクトとは、データに名前空間を結びつけたものという考え方を軸にすると、理解しやすいかな。