2017-09-01 144 views
0

我有一個數組:紅寶石 - 使用一個字符串作爲變量名稱來定義一個新的字符串變量

names = ['log_index', 'new_index'] 

我想要做的是從名字創建變量:

names.each { |name| name = [] } # obviously it does not do what I want 

這些變量在代碼中的任何位置之前未被聲明。

我該怎麼做?

+2

你是什麼意思的字符串在變量名? –

+1

'index'數組來自哪裏?爲什麼不通過'log_index = []'和'new_index = []'手動分配變量?你想達到什麼目的? – Stefan

回答

4

無法在Ruby中動態定義新的局部變量

在Ruby 1.8中可以使用eval 'x = 2'

您可以用evalbinding.local_variable_set更改現有變量。

我會考慮使用hash來存儲值。

+0

我同意這種情況下的'hash'思路,甚至像'index.each_with_object(Hash.new {| h,k | h [k] = []}){| i,obj | obj [i]} – engineersmnky

+0

@ShambhaviShinde考慮接受答案,答案的分數下面有一個'V'符號。 –

0

您可以使用此技巧:

names.each { |name| eval "def #{name}; []; end" } 
+0

在這種情況下'define_method'似乎比'eval'更合適。這就是說,它總是會返回一個空數組,因爲我假定它的目的是將信息存儲在它中,這看起來不是很有用。 – engineersmnky

0

在Ruby中,你不能動態地定義局部變量,但你可以動態定義實例變量:

names = ['log_index', 'new_index'] 
names.each { |name| instance_variable_set("@#{name}", []) } 

這給了你:

@log_index 
=> [] 
@new_index 
=> [] 

您還可以使用instance_variable_get動態訪問實例變量:

names = ['log_index', 'new_index'] 
names.each { |name| puts instance_variable_get("@#{name}").inspect }