在 Ruby 中,我可以将模块/类嵌套到其他模块/类中。我想要的是在文件或类中添加一些声明,以便能够通过它们的短名称引用嵌套类,例如使用Inner
to get Outer::Inner
,就像在 Java、C# 等中一样。语法可能是这样的:
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 的自动加载机制兼容的同时进行类似的导入?