如何取消命名ruby常量?

时间:2015-06-18 20:29:47

标签: ruby-on-rails ruby wash-out

我使用的是不处理命名空间模型的库。我有一个rails引擎,它包含我需要使用的所有ActiveRecord模型,因此我使用引擎的命名空间引用它们,例如:TableEngine :: Posts。

Ruby中有没有办法取消对Posts类的命名空间?

类似

<a href="#section1">Go to section 1</a>

2 个答案:

答案 0 :(得分:2)

首先,您可以添加所需的常量并将类/模块分配给它(记住两者都只是对象)。您应该复制它以重置名称:

Posts
# => Posts
TableEngine
# => NameError: uninitialized constant TableEngine
TableEngine::Posts
# => NameError: uninitialized constant TableEngine

然后删除源常量名称:

dup

然后:

class SomeClass

<强>更新即可。为什么需要Class

请注意,SomeClass = Class.new 是创建klass = Class.new # => #<Class:0x00000001545a28> klass.name # => nil 类型对象并将其分配给某个常量的快捷方式:

Klass = klass
# => Klass
klass.name
# => "Klass"

创建类时,其名称值未设置:

Class

第一次将其分配给常量时,将分配并记忆名称:

NewKlass = Klass
# => Klass
Klass.name
# => "Klass"
NewKlass.name
# => "Klass"

当您稍后将类型Object.send :remove_const, :Klass # => Klass NewKlass # => Klass NewKlass.name # => "Klass" Klass # => NameError: uninitialized constant Klass 的对象分配给另一个常量时,它仍然是同一个对象,由两个常量引用:

Object

这就是为什么即使删除了初始常量,对象也会继续使用旧名称。

Class

对象本身并没有改变。已更改的是new_klass = NewKlass.dup # => #<Class:0x000000016ced90> new_klass.name # => nil 对象携带的常量列表。

复制Posts = TableEngine::Posts.dup # => Post 类型的对象时,它创建时没有任何名称(它是新对象):

{{1}}

当你将它添加到新常量时,名称就会被设置。这就是上面第一个例子中它接收新名称的方式:

{{1}}

答案 1 :(得分:0)

我最终使用@Andrew建议的解决方案稍作改动:

::Posts = TableEngine::Posts.dup

添加&#39; ::&#39;防止Posts类被创建它的上下文命名,例如:

class PostsController < ApplicationController
    Posts = TableEngine::Posts.dup # => PostsController::Posts
    ::Posts = TableEngine::Posts.dup # => Posts
end