2010-12-15 74 views
5

在我的應用程序,我有如何在ruby中引用子模塊的「完整路徑」?

VeryUniqueModule::Foo 
# and… 
VeryUniqueModule::Bar 

FooBar各自針對不同的服務。我的應用程序的一部分,必須動態地找出指哪些模塊,它幹練做像這樣:

def service_api 
    # @relevant_object.service is a string that is either 'Foo' or 'Bar' 
    VeryUniqueModule.const_get(@relevant_object.service) 
end 

更多關於這個版本。

我剛剛更新了一個庫,它現在有它自己的頂級Foo類(這是其糟糕的設計)。現在,當我嘗試調用@relevant_object.service_api::A_CONSTANT時,我的應用抱怨庫的Foo沒有A_CONSTANT

回到service_api以上 - 我認爲const_get是返回類本身。其實我知道它是。如果我在irb中啓動它,一切都如預期的那樣 - 返回值是類本身,我可以在類中調用它。所以...

  1. 怎麼可能有一個名稱空間衝突的第一個地方?我正在尋找A_CONSTANT上的類對象service_api返回,而不是一個字符串,我eval ing或類似的東西 - 不應該有任何命名空間問題,我直接指的是一個對象!
  2. 如果這確實是一個問題,我該如何修復service_api以便它將返回erm「完整路徑」?
+0

你在做什麼似乎很好。其他地方可能有錯誤。 – 2011-06-13 19:20:34

回答

0

你可以試試這個:

VeryUniqueModule.const_get('::VeryUniqueModule::' + @relevant_object.service) 

如果不工作,你可以嘗試繞過service_api和這樣無論你需要A_CONSTANT

Object.const_get('::VeryUniqueModule::' + @relevant_object.service + '::A_CONSTANT') 

注意::VeryUniqueModule。在這種情況下,我認爲這不是必須的,但它可能有用,因爲它可以確保Ruby在全局名稱空間中查找VeryUniqueModule,而不是在其他某個模塊中查找。

+0

這是沒有辦法的任何工作。 'const_get'只接受常量的名稱,任何'::'都必須以其他方式處理。例如:'A級; B = 42;結束; Object.const_get(「A :: B」)#=> NameError:錯誤的常量名稱A :: B' – 2011-06-13 19:17:21