1

さまざまなコンテキストでさまざまなバージョンのクラスを使用するAPIを構築しようとしています。次のコードが、モジュールで正しい定数を検索するのではなく、初期化されていない定数Projectエラーを返すのはなぜですか?

module A
  module B
    class Project
    end
  end
end

A::B.module_eval do
  puts Project
end

終わり

4

1 に答える 1

3

でブロックを使用する場合、ブロックでmodule_eval定数が検索される方法は変更されません。メソッド、インスタンス、クラス変数のルックアップのみを変更します。これは、ブロックがクロージャであり、ブロック自体の周囲の環境の一部を維持するために必要な効果によるものです。

これは、の文字​​列バージョンを使用するか、module_evalconst_getを介して手動で定数を検索することで回避できます。

module A
  module B
    class Project
    end
  end
end

A::B.module_eval{ const_get(:Project) }
  #=> A::B::Project
于 2013-01-09T07:22:55.160 に答える