Ruby では、モジュール/クラスを他のモジュール/クラスにネストできます。私が望むのは、ファイルまたはクラス内にいくつかの宣言を追加して、ネストされたクラスを短い名前で参照できるようにすることです。たとえば、Java や C# などで使用Inner
するように getに使用しOuter::Inner
ます。構文は次のようになります。
module Outer
class Inner; end
class AnotherInner; end
end
class C
import Outer: [:Inner, :AnotherInner]
def f
Inner
end
end
単純化した実装は次のようになります。
class Class
def import(constants)
@imported_constants =
(@imported_constants || {}).merge Hash[
constants.flat_map { |namespace, names|
[*names].map { |name| [name.to_sym, "#{namespace}::#{name}"] }
}]
end
def const_missing(name)
const_set name, eval(@imported_constants[name] || raise)
end
end
Railsまたはいくつかのgemに、Railsの自動ロードメカニズムと互換性がありながら同様のインポートを行う確実な実装はありますか?