Class::Accessor::FastとClass::Data::Inheritableは、似ているように思えます(私には。cpanのサイトを見ても同じに見えます)。


しかし、さまざまなソースを見ると、使い分けられているので、私が知らないだけだと理解しています。

みなさま、使い分けている理由を教えてください。

参考url
http://trac.bloghackers.net/browser/lib/perl/WebService-KakakuCom/trunk/lib/WebService/KakakuCom.pm

回答の条件
  • 1人50回まで
  • 登録:2006/12/18 18:37:51
  • 終了:2006/12/18 19:26:58

回答(2件)

id:b-wind No.1

b-wind回答回数3344ベストアンサー獲得回数4402006/12/18 18:57:50

ポイント50pt

確かに良く似ていますが、実際には大きな違いがあります。

一言で言うと、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

となることで分かるかと思います。

id:makoron-P

c:は、d:に上書きされてしまうってこと?

2006/12/18 19:06:49
id:b-wind No.2

b-wind回答回数3344ベストアンサー獲得回数4402006/12/18 19:15:29

ポイント50pt

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 も定義されているので、リードオンリーなメソッド・ライトオンリーなメソッドも作る事が出来ます。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません