2013年3月5日火曜日

クラスのコンストラクタに配列を渡す

クラスのコンストラクタに配列を渡すには、以下のようにします。

main.pl


#!/opt/local/bin/perl;
package main;

use utf8;
use TestSub;
use Clone qw(clone);

@foo = ('A','B','C'); # 配列を作って

my $s = TestSub->new(\@foo); # コンストラクタに渡します
@foo = ();

$s->hello();


TestSubクラスを生成して配列(foo)を渡しています。
その後、TestSubクラスのhelloメソッドを呼び出しています。
helloメソッドは受け取った配列を表示するようにしています。

呼ばれる側のソースは以下のようになります。

TestSub.pm


package TestSub;                                                                                                        
use utf8;
use Clone qw(clone);

sub new {
    $self = shift; # クラス名を取得します
    $ref = shift;  # 配列への参照を受け取ります

    my $array = clone($ref); # 配列の中身をコピーします
    my @array2 = (4, 5, 6);  # もう1つ別のメンバ変数を作っています
    my $data = {             # メンバ変数を作っています
        ref => $array,        # 引数で渡された配列
        ref2=> \@array2,  # ついでにもう1つ配列
    };
    return bless $data, $self; # blessでメンバ変数とクラスを関連付けて返却
}

sub hello {
    my $self = shift; # クラス名を取得します
    my $test = $self->{ref}; # メンバ変数refを取得します
    foreach my $ref(@$test) {
        print "hello ref1:$ref\n";
    }  
    my $test2 = $self->{ref2};
    foreach my $ref(@$test2) {
        print "hello ref2:$ref\n";
    }  
}

1;


ミソとしては、配列の参照を受け取るだけなので、コンストラクタ内でコピーしてあげないといけない点です。上記ではcloneを呼び出して配列をコピーしています。(もちろんCloneを使わずに愚直に1要素づつコピーしてもOKです。)

実行結果は以下のようになります。


hello ref1:A
hello ref1:B
hello ref1:C
hello ref2:4
hello ref2:5
hello ref2:6






0 件のコメント:

コメントを投稿