コンストラクタ
コンストラクタって難しいけど、ここに手を出さなきゃプログラムの意味がない!
てなわけで、やってみることにしました!!!
いよいよ近づいてきました、オブジェクト指向!!!
姿を現し始めましたよ。検索していると、あちこちから「オブジェクト」という
名前が。
こわいなぁ。。。。
ひとまずコンストラクタについて勉強することにします。
まずコンストラクタとは?
「与えられたクラスのオブジェクトを生成する特別なサブルーチンです」
「newで呼び出すのが習慣です。」
?????ちんぷんかんぷんです。でもどうやら、オブジェクト指向には
かかせない様子。続いて読んでみます。
基本的なコンストラクタ(newサブルーチン)の形式
- 新しいオブジェクトの変数を初期化する。例えば、$selfに無名ハッシュをセットする
- オブジェクトのすべてのデータを初期化する。各属性に値やundef値を格納する
- blessコマンドでオブジェクトをブレスする。
- オブジェクトを返す
だ、そうです。ちんぷんかんぷんです。
ということで、実際にやってみた方が早そうなのでとりあえずやってみることに
しましょう。
Try1
###コンストラクタ作成
- Mugiwara.pm
sub new{
newという名前でサブルーチンを作ります。どうやらこれがコンストラクタになる
らしいですね。
my $class = shift;
newの第一引数としてクラス名が渡されることが決まりなので、shiftを使って受け
とります。これは決まりなので必ず書きます。
my $self = { name => $op{name} };
でました、「無名ハッシュのリファレンス」とやらですね。
my $self = {};でいいみたいです。ただし、属性を設定する場合は、ここで、
name=>$op{name}
といった感じで定義するといいみたいです。
要するに、かわるであろうと思われる変数をここでセットしなさいよ、ってこと。
私は%連想配列を使ってみました。$でも、@でもかまいません。
return bless $self,$class;
「ブレスする」とやらですな!これは、$self(無名ハッシュとやら)と、$class(クラス名)
を、「返す」っていうこと。myで呼ばれたとこに返すってことなのかなぁ??
よくわからないですが、ひとまずこれも決まり事なので書きます。
これがだいたいの流れのようです。
では、次にsyori.plの方に処理を書きます。
- syori.pl
use Mugiwara;
まず、モジュールの方を読み込みます。
my $obj = new Mugiwara(name => 'robin');
これは、$objという変数に右の結果を代入中です。
Mugiwaraモジュールの、newサブルーチンの、name属性を「robin」にしなさい!
ということになります。
my $value = $obj->main();
これが、サブルーチンの呼び出し方になります。
サブルーチン同様、引数を渡して結果を受け取ることだってできます!
$obj->main();
mainサブルーチンを呼び出しています。
$value = $obj->method1(10, 100);
引数を渡すときはこんな感じです。
そして最後に、
print $value;
表示して完了!!!
さて、結果を見てみましょう。
結果1
あれ?エラーです!!!
失敗。。。。
変数の宣言エラーがでてしまいました。
ということで、
my $class = shift;
の後に、
my %op;
と入れてみます。
結果2
ruffy,zoro,nami,usoppu,sanji,tyopper
エラーは消えましたが、ロビンいませんね。。。。
なんでだろう?と考えていましたが、発見!!!
そうか、データを受け渡してもらわないと当然表示されませんよね。
ということで、
my %op;
を、
my %op = @_;
と書き換えました。
結果3
ruffy,zoro,nami,usoppu,sanji,tyopperrobin
できたできた!できました〜♪♪
これでなんとかコンストラクタの基礎の基礎の基礎はクリアーなようです♪
MEMO
- syori.pl
#!/usr/bin/perl use strict; use Mugiwara; #モジュール読み込み my $obj = new Mugiwara(name => 'robin'); #変数セット my $value = $obj->main(); #サブルーチン呼び出し print $value;
- Mugiwara.pm
package Mugiwara; use strict; use vars qw($VERSION); $VERSION = 1.00; #コンストラクタ###################################### sub new{ my $class = shift; #第一引数を受け取る my %op = @_; #データ引き渡し my $self = { #無名ハッシュのリファレンス name => $op{name} #属性の設定 }; return bless $self,$class; #ブレスする } ##################################################### #処理 sub main { my $self = shift; #必ず全てのサブルーチンに書く my @onepiece2 = $self->eastblue(); #自分のモジュールの中のサブルーチン なので、$self->で呼び出す事 $self->grandline(@onepiece2); } sub eastblue{ my $self = shift; my @onepiece = ("ruffy,zoro,nami,usoppu,sanji,tyopper"); return @onepiece; } sub grandline{ my $self = shift; my @onepiece3 = @_; push(@onepiece3,$self->{name}); #syori.plから受け取った 引数を海賊団の配列へセットする print @onepiece3; } 1; #忘れずに!