しかし、さまざまなソースを見ると、使い分けられているので、私が知らないだけだと理解しています。
みなさま、使い分けている理由を教えてください。
参考url
http://trac.bloghackers.net/browser/lib/perl/WebService-KakakuCom/trunk/lib/WebService/KakakuCom.pm
確かに良く似ていますが、実際には大きな違いがあります。
一言で言うと、Class::Accessor::Fast はインスタンスごとに値を持ち、Class::Data::Inheritable はクラスごとに値を持ちます。
例を挙げると、
#!/usr/bin/perl; package MyCAF; use base qw/Class::Accessor::Fast Class::Data::Inheritable/; __PACKAGE__->mk_accessors('data'); package MyCDI; use base qw/Class::Accessor::Fast Class::Data::Inheritable/; __PACKAGE__->mk_classdata('data'); package main; my $a = MyCAF->new(); my $b = MyCAF->new(); $a->data('data_a'); $b->data('data_b'); printf "a:%s, b:%s\n",$a->data,$b->data; my $c = MyCDI->new(); my $d = MyCDI->new(); $c->data('data_c'); $d->data('data_d'); printf "c:%s, d:%s\n",$c->data,$d->data;
の実行結果が、
a:data_a, b:data_b c:data_d, d:data_d
となることで分かるかと思います。
c:は、d:に上書きされてしまうってこと?
結果的にはそうなります。
言い方を変えるなら、Class::Data::Inheritable で作られるメソッドが扱う変数はクラスごとのグローバル変数に近いものです。
Java で言うところのクラス変数が一番概念的に近いです。
なので、後半部分を
my $c = MyCDI->new(); my $d = MyCDI->new(); $c->data('data_c'); $d->data('data_d'); MyCDI->data('Class_Data'); printf "c:%s, d:%s\n",$c->data,$d->data;
とすると出力は
c:Class_Data, d:Class_Data
になります。上書きと言うよりは同じものを表していると言う表現の方が近いでしょうか。
本質的な部分では無いですが、別の部分の違いとして、Class::Data::Fast には mk_ro_accessor/mk_wo_accessor も定義されているので、リードオンリーなメソッド・ライトオンリーなメソッドも作る事が出来ます。
c:は、d:に上書きされてしまうってこと?