Ruby 在模块命名空间中创建动态命名的类

Ruby 在模块命名空间中创建动态命名的类,ruby,grape,Ruby,Grape,我正在使用一个GrapeAPI,我有一些模型,它们有一个url属性,我正在使用该属性动态装载端点。我需要能够对它们进行版本设置,但在生成它们时,我很难让它们正确地命名 如果我在一个模块中创建一个类,那么这个类是有名称空间的 module MyModule module SubModule class MyClass end end end => nil MyModule::SubModule::MyClass => MyModule::SubModule::

我正在使用一个GrapeAPI,我有一些模型,它们有一个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 
但是,如果我在模块中动态创建类,它就没有名称空间

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
显式设置对象名称空间中的常量,即根名称空间。如果使用
const\u set
而不使用
Object
,它将在当前名称空间中设置常量,在您的示例中是
MyModule::SubModule

您只需执行
const\u set
,不需要
对象。
好吧,您明确告诉Ruby在
Object
中设置常量,你期待什么?您可以明确地告诉Ruby以完全相同的方式在其他地方设置常量。谢谢Max!乔格,你说得对,但在这种情况下,马克斯一针见血。我应该把它设置在当前的范围内。