[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