2015-11-02 47 views
-2

是否有可能做這樣的事情在Ruby中:紅寶石 - 名稱解析使用可變

var_1 = Module 
var_2 = NestedModule 

object = ::var_1::var_2::SomeObject.new # class resolves to ::Module::NestedModule::SomeObject 

雖然上面的代碼在Ruby中不起作用,有沒有替代辦法做到這一點,或者這是不是可能?

回答

0

你可以做這樣的事情:

klass = Object.const_get("::#{var_1}::#{var_2}::Object") 
object = klass.new 
+0

這是用來獲取簡單常量的值,對吧?它不適用於類定義。 –

+2

類與其他對象一樣是對象,而類定義只是將對象分配給常量的快捷方式。沒有「簡單」和「非簡單」常量這樣的事情。只有常數。 –

1

首先,NestedModule是一個可變的名聲,其實,這是積極誤導性:該模塊沒有嵌套(沒有嵌套模塊在Ruby中),它是嵌套的常量

事實上,這正是導致這個問題的混亂。

因此,常數NestedModule嵌套在由常數Module引用的模塊內,但由於您的第一行,也可通過局部變量var_1訪問該模塊。 (請記住,Module s爲對象,就像任何其他的對象!):

var_1 = Module 

var_2得到NestedModule一個參考,你可以這樣做:

var_2 = var_1::NestedModule 

最後,得到一個參考SomeObject,你可以這樣做:

var_2::SomeObject.new 
+0

我還沒有發佈實際的代碼,只是足以解釋我正在嘗試做什麼。另外,你測試了你發佈的代碼嗎?因爲它不起作用。 –

+0

它適合我。定義「它不起作用」。什麼是*確切*錯誤消息你正在得到? –