Ruby 在模块命名空间中创建动态命名的类
我正在使用一个GrapeAPI,我有一些模型,它们有一个url属性,我正在使用该属性动态装载端点。我需要能够对它们进行版本设置,但在生成它们时,我很难让它们正确地命名 如果我在一个模块中创建一个类,那么这个类是有名称空间的Ruby 在模块命名空间中创建动态命名的类,ruby,grape,Ruby,Grape,我正在使用一个GrapeAPI,我有一些模型,它们有一个url属性,我正在使用该属性动态装载端点。我需要能够对它们进行版本设置,但在生成它们时,我很难让它们正确地命名 如果我在一个模块中创建一个类,那么这个类是有名称空间的 module MyModule module SubModule class MyClass end end end => nil MyModule::SubModule::MyClass => MyModule::SubModule::
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!乔格,你说得对,但在这种情况下,马克斯一针见血。我应该把它设置在当前的范围内。