私は大好きですthe autoload functionality of Ruby;ただし、スレッドセーフではないため、going away in future versions of Rubyです。Rubyでオートロードせずにクラスをオートロードする
だから私はすでにで遅延ロードメカニズムを実装しているので、すでにそれがなくなって自分のコードを書いたふりをしたいと思います。私は可能な限り簡単な方法で実装したいと思っています(今はスレッドの安全性について気にしません)。 Rubyはこれを可能にするはずです。
クラスのconst_missing
を増強することによって開始するのをしてみましょう:
class Dummy
def self.const_missing(const)
puts "const_missing(#{const.inspect})"
super(const)
end
end
我々が欠けている 『ダミー』の下で定数を参照しようとすると、私たちは「ダミーを参照しようとした場合のRubyは、例えば、この特別なメソッドを呼び出します。 :こんにちは "、:Hello
とconst_missing
を呼び出します。これは、私たちが必要とする正確に何である、それでは、さらにそれをみましょう:私たちは「ダミー:: OAuthの」参照する場合
class Dummy
def self.const_missing(const)
if :OAuth == const
require 'dummy/oauth'
const_get(const) # warning: possible endless loop!
else
super(const)
end
end
end
を今、それは "を定義することが期待される「ダミー/ oauth.rb」ファイルが必要になりますダミー:: OAuth "定数。 const_get
(内部ではを呼び出すことができるので)という無限ループが発生する可能性がありますが、それを守ることはこの質問の範囲外です。
トップレベルの名前空間に "OAuth"という名前のモジュールが存在すると、大きな問題が発生します。「Dummy :: OAuth」を参照すると、const_missing
がスキップされ、トップレベルから「OAuth」が返されます。ほとんどのRuby実装もこのことについて警告行います:
warning: toplevel constant OAuth referenced by Dummy::OAuth
This was reported as a problem way back in 2003を私はRubyのコアチームはこのことについて、これまで心配していたという証拠を見つけることができませんでした。今日、最も人気のあるRubyの実装は同じ動作をしています。
問題は、const_missing
は、最上位の名前空間の定数のために黙ってスキップされるということです。これはRubyのautoload
機能で "Dummy :: OAuth"が宣言された場合には発生しません。これを回避する方法は?
これは愚かな提案のように思えるが、あなたは、 'autoload'のCソースを見ることができますか?私はあなたがRubyソースのどこかでそれを見つけることができると確信しています。あなたがまっすぐなRubyでそれをすることができないなら、(通訳者の下腹にアクセスできる)C拡張を作成するオプションがあります。 – Linuxios
オプションです。 – mislav
はブルートフォースのように聞こえるが、トップレベルクラスでは 'remove_const'できないだろうか? – phoet