我正在使用不處理名稱空間模型的庫。我有一個Rails引擎,它具有我需要使用的所有ActiveRecord模型,因此我使用引擎的名稱空間引用它們,例如:TableEngine :: Posts。如何取消命名空間的紅寶石常量?
有沒有辦法在Ruby中取消命名空間Posts類?
像
TableEngine::Posts.demodulize # => Posts
我正在使用不處理名稱空間模型的庫。我有一個Rails引擎,它具有我需要使用的所有ActiveRecord模型,因此我使用引擎的名稱空間引用它們,例如:TableEngine :: Posts。如何取消命名空間的紅寶石常量?
有沒有辦法在Ruby中取消命名空間Posts類?
像
TableEngine::Posts.demodulize # => Posts
起初,你可以添加你需要的常量和類圖/模塊分配給它(記得兩者都只是對象)。你應該重複它重置名稱:
Posts = TableEngine::Posts.dup
然後刪除源恆名稱:
Object.send :remove_const, :TableEngine
然後:
Posts
# => Posts
TableEngine
# => NameError: uninitialized constant TableEngine
TableEngine::Posts
# => NameError: uninitialized constant TableEngine
UPDATE。爲什麼dup
需要:
通知,class SomeClass
是創建Class
類型的對象並將其分配給一些固定的快捷方式:
SomeClass = Class.new
當你創建一個類,它的名字未設置值:
klass = Class.new
# => #<Class:0x00000001545a28>
klass.name
# => nil
當你把它分配給常數首次名稱分配和memoized:
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
而當你把它assing新恆,名稱設置。那就是如何在它上面接收新名稱的第一個例子:
Posts = TableEngine::Posts.dup
# => Post
爲什麼當你刪除引用原始文件並且因此有資格進行垃圾回收時會「重複」呢?事實上,即使你沒有刪除參考文獻,我也不明白爲什麼要「複製」課程。 –
我結束了使用@Andrew一個輕微的修改建議的解決方案:
::Posts = TableEngine::Posts.dup
添加「::」防止了帖子類從由內創建它的上下文,離被命名空間:
class PostsController < ApplicationController
Posts = TableEngine::Posts.dup # => PostsController::Posts
::Posts = TableEngine::Posts.dup # => Posts
end
你能創建擴展模塊化的類的類,或創建被設置爲模塊化的類的恆定?我想,這看起來有點won and,可能會以其他壯觀的方式突破。 –