2013-10-23 14 views
0
@object0 = "bars" 
@object1 = "foobs" 

query0 = "@object" + "0" 
puts instance_variable_get(query0) #=> bars 

puts instance_variable_get(:@object1) #=> foobs 

query1 = ":" + "@object" + "1" 
puts instance_variable_get(query1) #=> ':@object1' is not allowed as an instance variable name! 

問題絕對是冒號,儘管它是唯一可以在全局範圍內引用實例變量的方法。我認爲instance_variable_get方法對於自己的好處太聰明瞭。無論如何強迫它接受它視爲無效的實例變量?任何解決方法?起初,我認爲我可能會做一些事情,因爲我正在向該方法傳遞一個簡單的字符串,但正如您所看到的,instance_variable_get的前兩個用法完美地工作,並且它們使用字符串。instance_variable_get不會接受有效的實例變量名稱

回答

1

:@ object1是一個符號。

「:」+「@object」+「1」是一個字符串。

它告訴你,你不能有開頭實例變量名「:」

+0

顯然,你甚至不看我的問題。這甚至不是答案,所以請發表評論。不知道是誰投了票.. – Starkers

+0

這是一個答案。我指出你前兩次調用get_instance_variable不是都使用Strings。一個使用字符串,一個使用符號。他們不是一回事,而是你似乎遇到麻煩的地方。至於以「:」開頭的變量名稱,沒有解決方法,我不太清楚導致問題的方式。 –

+0

@明星確實,這是正確答案的一半。另一半 - 你需要對你的代碼做出什麼樣的改變才能實現它 - 在薩瓦的回答中。 –

2

由於一些蓋伊已經指出,一個實例變量必須@,不:啓動。

query1 = "@object" + "1" 
puts instance_variable_get(query1) 

或(冗餘),

query1 = ("@object" + "1").to_sym 
puts instance_variable_get(query1)