From: matz@... (Yukihiro Matsumoto) Date: 1998-03-23T18:31:36+09:00 Subject: [ruby-dev:1902] Re: [Bug] autoload problem まつもと ゆきひろです 恐らくautoloadの仕様の拡張の提案だと思うのですが,その前に現 状を確認しておきましょう. In message "[ruby-dev:1889] [Bug] autoload problem" on 98/03/23, Keiju ISHITSUKA writes: | |けいじゅ@日本ラショナルソフトウェアです. | |モジュール内のクラスのautoloadができないようです. まず,[ruby-dev:1890]で既に述べましたが,現状のautoloadはトッ プレベルのクラス用になっています.第一引数に指定した文字列 (またはシンボル)はそのままクラス名として使われます. ですから, |autoload "::A0::A", "foo.rb" という指定は,"::A0::A"という名前の定数が参照されたら foo.rb というファイルをロードするという意味になります.もちろん,そ のような定数を定義することは出来ませんから,foo.rbは一生ロー ドされません. # ここで「定数でない名前を指定した時点でエラーにすべき」とい # う指摘はもっともです.そのようにせよ,という提案は受け入れ # られます. |autoload "A", "foo.rb" |module A0 | A.new |end | |とすると, | |./foo.rb:4: Uninitialized constant A (NameError) | |となりますので, 定義されていないシンボルのloadのアルゴリズムに問題があ |るのでは? このプログラム,うちのrubyでは ./test.rb:4: No such file to load -- foo.rb (LoadError) となります.もちろん,foo.rbを用意してやれば動いているように 見えます.これは私の意図している仕様通りです. もし,エラーメッセージが示す通り ./foo.rb という名前にしちゃ うと無限ループが発生すると思うんですが,これまた私の意図通り で,このループはしょうがないと思ってます. で,考えられる提案は (1) 定数名が変なシンボルだったらエラーにしてくれ (2) (うちでは再現しなかったが)バグがある,直してくれ (3) クラス内定数もautoloadできるようにしてくれ の3つがあります.1は受け入れます.そういう意図でしたら,すぐ に修正します.2でしたらもうちょっと詳しい情報を下さい. で,問題の3ですが,これは拒否しようかなあと思ってます.指定 方法が難しい(クラス内定数を示すシンボルってのは存在しない)の と実装がややこしくなりそうってのが,主な理由です. まつもと ゆきひろ /:|)