From: matz@... (Yukihiro Matsumoto) Date: 1998-03-24T09:56:03+09:00 Subject: [ruby-dev:1907] Re: [Bug] autoload problem まつもと ゆきひろです In message "[ruby-dev:1905] Re: [Bug] autoload problem" on 98/03/23, 石塚圭樹 writes: |けいじゅ@日本ラショナルソフトウェアです. |すいませんでした. "::A0::A"だとエラーが出るので, | |autoload "A0::A", "foo.rb" | |で試したのでした. これも同じですね.A0::A という定数の参照されるのを永遠に待ち 続けます. |でも, | |NameError: Unknown operator `::A::B' | |ってどういう意味ですか? | |# "::AA::FF".internでも同じ例外が発生しますね(?_? internは先頭の一文字を調べて,大文字か,小文字か,$か,@かで それぞれ分類しています.それ以外の場合だと演算子だと思ってテー ブルを検索するんですが,:の場合どれにも該当しないんでこのよ うなエラーになってます.より適切なメッセージがあれば提案して 下さい. |それに, | autoload "A0::A", "foo.rb" |は通るのでまだ完全ではないみたいです. これは仕様だと思ってます.つまり,先に述べたようにinternは先 頭の一文字しか見ないので,A0::Aというのはinternとしてはvalid な文字列です.それをruby的に参照できないだけで. # これが不適切だというのでしたら,それはそれで議論しても構い # ませんが. |すいません. foo.rbは | |module A0 | class A | end |end | |でした. あくまでも, クラス内クラスを定義したかったのでした. この場合autoloadはfoo.rbのロードによって,トップレベルにAが 定義されることを期待しますので,Aが定義されないと言うエラー になったわけです. |>もし,エラーメッセージが示す通り ./foo.rb という名前にしちゃ |>うと無限ループが発生すると思うんですが,これまた私の意図通り |>で,このループはしょうがないと思ってます. | |どういうこと?? このautoloadを含むファイル名がfoo.rbだと,autoloadで自分自身 を呼んで,無限ループになると言うこと. |>で,問題の3ですが,これは拒否しようかなあと思ってます.指定 |>方法が難しい(クラス内定数を示すシンボルってのは存在しない)の |>と実装がややこしくなりそうってのが,主な理由です. | |指定の方法は文字列で行なえば良いと思います. | | autoload "AA::FF",... |or | autoload "::AA::FF",... うーん,一応シンボルを考えているのですけどねえ.文字列はシン ボルに変換するための方便だと考えているのです. まあ,提案通り文字列で::で区切るような仕様にしたとしても,実 装が複雑になる割にはあんまり嬉しくないですし,石塚さん自身も |でも, autoloadはトップレベルクラス(モジュール)をロードするというのも仕 |様としてはそんなにおかしくないと思いますので, 現状のままでも良いですけ |ど... とおっしゃってますので,現状維持としたいです. まつもと ゆきひろ /:|)