さまざまなコンテキストでさまざまなバージョンのクラスを使用するAPIを構築しようとしています。次のコードが、モジュールで正しい定数を検索するのではなく、初期化されていない定数Projectエラーを返すのはなぜですか?
module A
module B
class Project
end
end
end
A::B.module_eval do
puts Project
end
終わり
さまざまなコンテキストでさまざまなバージョンのクラスを使用するAPIを構築しようとしています。次のコードが、モジュールで正しい定数を検索するのではなく、初期化されていない定数Projectエラーを返すのはなぜですか?
module A
module B
class Project
end
end
end
A::B.module_eval do
puts Project
end
終わり
でブロックを使用する場合、ブロックでmodule_eval
定数が検索される方法は変更されません。メソッド、インスタンス、クラス変数のルックアップのみを変更します。これは、ブロックがクロージャであり、ブロック自体の周囲の環境の一部を維持するために必要な効果によるものです。
これは、の文字列バージョンを使用するか、module_eval
const_getを介して手動で定数を検索することで回避できます。
module A
module B
class Project
end
end
end
A::B.module_eval{ const_get(:Project) }
#=> A::B::Project