2006 年 4 月 15 日 23 時 58 分

型グロブ


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


シンボルテーブルの中身をダンプしてみると、
そこにはメソッドや変数名が登録されていた。
しかし、全てのシンボルに * 文字が含まれている。
* がついているということは、型グロブであると言うことだ。

'salary' => *Employee::salary

Perl の識別子は、データ型ごとに名前空間を持つ。
なので、$value、@value、%value、&value、value は、
それぞれ異なる識別子として共存することができる。
通常は、先頭につく記号などでそれらを区別する。

上記のような変数がパッケージにある場合、
それはシンボルテーブルに登録されているが、
シンボルテーブルは型ではなく名前ごとにキーがあるので、
上記全ての変数は、「value」というキーに登録される。

シンボルテーブルは、上記の変数を区別するために、
キーに対応する値として型グロブを格納している。
型グロブは、シンボルテーブル内部で使用される型であり、
同じ名前を持つ別の型を保持している、特別な型である。

では、シンボルテーブルを経由して、
Employee パッケージの $Version 変数を参照してみよう。


# シンボルテーブル %Employee:: のリファレンスを得る。
my $symbols = \%Employee::;

# Version の型グロブを得る。
my $glob = $symbols->{'Version'};

# $glob をスカラとしてデリファレンスすると、
# $Employee::Version にアクセスしたことになる。
print $$glob;

# これは @Employee::Version 配列を指す。
print @$glob;

型グロブに対してデリファレンスすると、
デリファレンスした時の型の変数にアクセスできるのだ。
これは通常のリファレンスにはない特別な働きである。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.