我有一個數組:紅寶石 - 使用一個字符串作爲變量名稱來定義一個新的字符串變量
names = ['log_index', 'new_index']
我想要做的是從名字創建變量:
names.each { |name| name = [] } # obviously it does not do what I want
這些變量在代碼中的任何位置之前未被聲明。
我該怎麼做?
我有一個數組:紅寶石 - 使用一個字符串作爲變量名稱來定義一個新的字符串變量
names = ['log_index', 'new_index']
我想要做的是從名字創建變量:
names.each { |name| name = [] } # obviously it does not do what I want
這些變量在代碼中的任何位置之前未被聲明。
我該怎麼做?
無法在Ruby中動態定義新的局部變量。
在Ruby 1.8中可以使用eval 'x = 2'
。
您可以用eval
或binding.local_variable_set
更改現有變量。
我會考慮使用hash
來存儲值。
我同意這種情況下的'hash'思路,甚至像'index.each_with_object(Hash.new {| h,k | h [k] = []}){| i,obj | obj [i]} – engineersmnky
@ShambhaviShinde考慮接受答案,答案的分數下面有一個'V'符號。 –
您可以使用此技巧:
names.each { |name| eval "def #{name}; []; end" }
在這種情況下'define_method'似乎比'eval'更合適。這就是說,它總是會返回一個空數組,因爲我假定它的目的是將信息存儲在它中,這看起來不是很有用。 – engineersmnky
在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 }
你是什麼意思的字符串在變量名? –
'index'數組來自哪裏?爲什麼不通過'log_index = []'和'new_index = []'手動分配變量?你想達到什麼目的? – Stefan