在模块命名空间中创建动态命名的 class
Create dynamically named class within module namespace
我正在使用 Grape API 并且我的模型具有 url 属性,我正在使用该属性为其动态安装端点。我需要能够对它们进行版本控制,但在生成它们时无法正确命名它们。
如果我在模块中创建 class,则 class 是命名空间。
module MyModule
module SubModule
class MyClass
end
end
end
=> nil
MyModule::SubModule::MyClass
=> MyModule::SubModule::MyClass
但是,如果我动态地在模块中创建 class,则它没有命名空间。
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
有没有办法为动态创建的 class 命名空间?
Object.const_set
显式设置 Object 命名空间中的常量,该命名空间是根命名空间。如果您在没有 Object
的情况下使用 const_set
,它将在当前名称空间的任何位置设置常量,在您的示例中为 MyModule::SubModule
。
我正在使用 Grape API 并且我的模型具有 url 属性,我正在使用该属性为其动态安装端点。我需要能够对它们进行版本控制,但在生成它们时无法正确命名它们。
如果我在模块中创建 class,则 class 是命名空间。
module MyModule
module SubModule
class MyClass
end
end
end
=> nil
MyModule::SubModule::MyClass
=> MyModule::SubModule::MyClass
但是,如果我动态地在模块中创建 class,则它没有命名空间。
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
有没有办法为动态创建的 class 命名空间?
Object.const_set
显式设置 Object 命名空间中的常量,该命名空间是根命名空间。如果您在没有 Object
的情况下使用 const_set
,它将在当前名称空间的任何位置设置常量,在您的示例中为 MyModule::SubModule
。