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 19:26:58
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:b-wind No.1

回答回数3344ベストアンサー獲得回数440

ポイント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

回答回数3344ベストアンサー獲得回数440

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

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

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

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

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

回答リクエストを送信したユーザーはいません