【问题标题】:Create dynamically named class within module namespace在模块命名空间中创建动态命名的类
【发布时间】:2017-08-19 07:03:59
【问题描述】:

我正在使用 Grape API,并且我的模型具有 url 属性,我正在使用该属性来动态安装端点。我需要能够对它们进行版本控制,但在生成它们时无法正确命名它们。

如果我在模块中创建一个类,该类是命名空间的。

module MyModule
  module SubModule
    class MyClass
    end
  end
end
=> nil 
MyModule::SubModule::MyClass
=> MyModule::SubModule::MyClass 

但是,如果我在模块中动态创建类,则它没有命名空间。

module MyModule
  module SubModule
    dynamic_name = "ClassName"
    Object.const_set(dynamic_name, Class.new)
  end
end
=> ClassName 
MyModule::SubModule::ClassName
NameError: uninitialized constant MyModule::SubModule::ClassName
ClassName
=> ClassName 

有没有办法为动态创建的类命名空间?

【问题讨论】:

  • 你可以const_set,不需要Object.
  • 好吧,你明确地告诉Ruby在Object中设置常量,你期待什么?您可以明确地告诉 Ruby 以完全相同的方式将常量设置在其他位置。
  • 谢谢麦克斯! Jorg,你是对的,但在这种情况下,Max 一针见血。我应该在当前范围内设置它。

标签: ruby ruby-grape


【解决方案1】:

Object.const_set 显式设置 Object 命名空间中的常量,也就是根命名空间。如果您使用const_set 而不使用Object,它将在当前命名空间中设置常量,在您的示例中为MyModule::SubModule

【讨论】:

    猜你喜欢
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    • 2016-01-05
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    • 2012-06-25
    • 1970-01-01
    相关资源
    最近更新 更多