Perlゼミ

Perlでテキスト処理、Linuxサーバー管理、Webシステム開発

Class::Struct - オブジェクト指向を提供するコアモジュール

Class::Structは、Perlにオブジェクト指向の機能を提供する古典的なモジュールです。コンストラクタnewの自動生成、アクセッサの自動生成ができます。アクセッサとは、フィールドの設定・取得を行うためのメソッドのことです。

Perl入門ゼミでは、オブジェクトの基本型として、ハッシュリファレンスを持ち、スカラのアクセッサを提供する方法を解説します。

xとyというフィールドを持つPointクラスの作成

Class::Structを使って、xとyというフィールドを持つPointクラスを作成してみましょう。

package Point;

use Class::Struct __PACKAGE__, {
  x => '$',
  y => '$',
};

useでは、モジュール名の後ろに引数を渡すことができます。

第一引数は、パッケージ名です。この引数で、どのパッケージに対して、コンストラクタやアクセッサを生成するのかを指定します。__PACKAGE__は、現在のパッケージ名を返す関数で、Pointが返ります。

第二引数は、フィールドを定義した、ハッシュのリファレンスです。アクセッサが自動生成されます。

Pointクラスの利用

Pointクラスを利用してみましょう。先ほどのコードに続けて以下を記述します。

package main;

# オブジェクトの生成
my $point = Point->new(x => 1, y => 2);

# フィールドの値をアクセッサを使って取得
my $x = $point->x;
my $y = $point->y;
print "($x, $y)\n";

# フィールドの値をアクセッサを使って設定
$point->x(5);
$point->y(10);
my $x2 = $point->x;
my $y2 = $point->y;
print "($x2, $y2)\n";

mainパッケージについては、パッケージの宣言の記事を参考にしてください。

コンストラクタnewの呼び出し

コンストラクタnewを呼び出すことができます。フィールドの値を渡すこともできます。

# オブジェクトの生成
my $point = Point->new(x => 1, y => 2);

アクセッサの呼び出し

値の設定・取得を行うために、アクセッサを呼び出すことができます。

# フィールドの値をアクセッサを使って取得
my $x = $point->x;
my $y = $point->y;
print "($x, $y)\n";

# フィールドの値をアクセッサを使って設定
$point->x(5);
$point->y(10);
my $x2 = $point->x;
my $y2 = $point->y;
print "($x2, $y2)\n";

Class::Structで、継承することはできますか?

Class::Strcutによって作成したクラスを継承することは可能ですが、制限として、フィールドを追加するということはできません。継承を行いたい場合は、フィールドを追加したい場合が、ほとんどですので、できないと考えておくのがよいでしょう。

継承を予定しているのであれば、Perlコア限定ならblessを使ってオブジェクトを作成します。CPANモジュールを利用する場合は、継承によるフィールド定義の追加をサポートしているモジュールを利用しましょう。

コンストラクタをオーバライドすることはできますか?

Class::Strcutでは、対象のクラスにコンストラクタが生成されますので、コンストラクタをオーバーライドすることはできません。

コンストラクタのカスタマイズを予定しているのであれば、Perlコア限定ならblessを使ってオブジェクトを作成します。CPANモジュールを利用する場合は、コンストラクタのカスタマイズをサポートしているモジュールを利用しましょう。

Perlの入門書
  • 初めてのPerl 第7版

    Perl入門 定番の一冊
  • 業務に役立つPerl

    ログ解析など日本語を含むテキスト処理の実践!
Twitter
Perlゼミの情報が役立ったら、フォロー、いいね、リツートで応援。