From: Nobuyoshi Nakada Date: 2007-02-27T15:02:33+09:00 Subject: [ruby-dev:30437] Re: fail to autoload at $SAFE==4 なかだです。 At Tue, 27 Feb 2007 11:45:40 +0900, Hidetoshi NAGAI wrote in [ruby-dev:30435]: > > ということで考えたのが、以下の二つの案です。 > > (1) safe_levelを指定して探してくれるrb_provided()を追加する > > (2) rb_provided()は拡張ライブラリについてはあきらめる もう一つ考えました。 (3) autoloadを指定したときに実際にロードされるはずのライブラリを 探し、.rbか.soか確定してしまう > > rb_provided()はautoload関連でしか使われていないので、とりあえず > > は(2)でいいのではないかと思います。拡張ライブラリだけロードされ > > た時点では未定義の定数がdefined?やautoload?で真を返すようになり > > ますが、実際に参照されればconst_missingになるので、許容範囲では > > なかろうかと。 > > 「(1) であれば autoload 定義時の $SAFE で呼べるので理想的ではあるが, > 実装の効果と手間とを考えると...」という理解でいいでしょうか? > よく分かってないのですが,(2) の仕様で「ギャッ」というケースは > ないのでしょうか? たとえば、foo.rbはないがFooだけを定義する拡張ライブラリfoo.soは あるとすると、以下のコードはNameErrorになります。 autoload :Bar, "foo" require "foo" Bar if defined?(Bar) 本来なら、もう"foo"としてロードできるものがないのだから、最後の defined?(Bar)はnilになるはずです。もっとも、defined?とBarの参照 の間にfoo.rbが作られないという保証はない、と考えれば正しい動作か もしれませんが。 今気づきましたが、動的にスクリプトを$LOAD_PATHに作るという可能性 を考えるなら、ロード済みの.soの有無をロード中の.rbの有無よりも優 先させてはまずいので、最後のif文はこうですね。 if (rb_feature_p(feature, feature + strlen(feature), Qtrue)) -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦