概要: Perl のパッケージについてのメモ。
Perl のパッケージを Javascript にできる限り忠実に移植するため、 Perl のパッケージの挙動を簡単にまとめてみる。
- package = Class 名
- デフォルトのパッケージ名は main
- パッケージの有効範囲はその Block 内
- パッケージ内のグローバル変数、関数はそのパッケージに属する
ぐらい?
ちなみに Javascript にはパッケージなんて無いんだけど、JSAN の場合、
- Class 名 = グローバルオブジェクトの階層 (例:
Foo.Bar = {}
みたいな) - クラスに属する変数、関数は prototype に突っ込む(?)
のような感じだったりする。
さっき気づいたけど、Javascript でパッケージみたいなのを実装しようとすると、 下位の名前空間と上位の変数(若しくは関数)が衝突しやすいような気がする。 あ、でも Perl でも同じか?関数指向だと衝突しやすくて、オブジェクト指向だと衝突しにくいのかな?
ちょっと実験
package Foo::Bar;
sub Baz { print "aaa\n" }
package Foo::Bar::Baz;
sub new { bless {}, shift }
package main;
Foo::Bar::Baz();
print ref(Foo::Bar::Baz->new());
実行結果
aaa
aaa
Can't call method "new" without a package or object reference at - line 9.
こうなったということは、関数指向の package の下位にオブジェクト指向の package を作ろうとすると、 衝突することがある、ということか。
Ruby とかどうなっているんだろう?ちらっとコード見かけたことあるけど、
Foo::Bar.new()
こんな感じだったから衝突しないのかな?詳しくは知らないけど。うーん。
#FIXME