[kansaipm] Re: Privateなサブルーチン
Keisuke Hashimoto
ksk at be.to
Thu Feb 7 11:41:53 CST 2002
こんにちは、はしもとです。
On Fri, 08 Feb 2002 01:01:03 +0900 (LMT)
mishima at momo.so-net.ne.jp wrote:
> Class->sub() と呼ばれた場合には、1個目の引数にクラス(パッケージ)の
> 名前が渡ってくるんじゃなかったでしょうか。
> Class::sub() だと引数は見たまんま(この場合は引数無し)で、
> $instance->sub() の場合には、1個目の引数に bless されたリファレンスが
> 渡ってくるんですよね。
これをifで場合分けすると、こんな感じですかねぇ?
sub foo
{
my $pkg = ref $_[0];
if( $pkg and $pkg eq __PACKAGE__ ) {
# $instance->foo()の場合...
}else {
if( defined $_[0] and $_[0] eq __PACKAGE__ ) {
# Class->foo()の場合...
}else {
# Class::foo()の場合...
}
}
}
でも、Class::foo()でたまたまパッケージ名と同じ文字列が渡されたら
ダメですし、このClassの派生クラスのインスタンスから、このClass
のメソッドがコールされてもパッケージ名が一致しないからダメですね。
でも、メソッドコールかそうでないかの判断だけなら、
sub foo2
{
my $pkg = ref $_[0];
my %ref = map { ( $_ => 1 ) } qw( REF SCALAR ARRAY HASH CODE GLOB );
if( $pkg and not exists $ref{ $pkg } ) {
# メソッドコール
}else {
# それ以外
}
}
でもOKかな?
#================================================================#
橋本 敬介 - Keisuke Hashimoto -
Plain Text mailto:ksk at be.to
#================================================================#
More information about the Kansai-pm
mailing list