2012-06-23 19 views
3

可能重複:
Is there a Ruby equivalent to PHP's extract?轉乘哈希鍵和Ruby的局部變量名

有什麼辦法採取一個Ruby散列如:

myhash = {a: 12, b:24, c:36} 

和將其轉換爲一組局部變量(顯然,手動完成任務)?結果應該是一樣,如果我執行的語句:

a = 12 
b = 24 
c = 36 

同樣,我可以拿一組定義的局部變量,並進行散列,其中鍵是變量名和值的變量值(再次,缺乏書面散列字面意思)?我還沒有見過這樣的事情之前,所以我猜答案是否定的,但它會很美好......

+0

無論你正在試圖做的,還有幾乎可以肯定是一個更好的辦法。你能提供更多信息,所以我們可以提出一個不同的解決方案 –

+0

@JoshuaCheek我發現自己經常以中等大小的散列作爲參數。這是繁瑣和膨脹的必須通過散列語法存儲在這些哈希值始終 - 我想我可以'解壓縮'(或提取)在我的方法內部的散列,做任何我設定的操作,然後在返回時重新包裝它。 –

+0

我懷疑答案是接受面向對象。如果哈希是選項,請將它們拉出並設置爲ivars。如果你真的在操縱它們,那麼你很有可能應該使用對象而不是哈希(而不是在哈希中保存數據,對象保存它,而不是操縱哈希的數據,你告訴對象操縱它自己的數據數據)。沒有看到更多的代碼很難給出更好的建議。 –

回答

0

你可以做很多這方面的東西與Kernel.eval

a = 1; b = 2; c = 3 

local_variables.grep(/^[a-z]\w*/) 
=> ["a", "b", "c"] 

# Map local variables to hash 
@h = Hash[local_variables.grep(/^[a-z]\w*/).map { |var| [var, eval(var)] }]  
=> {"a"=>1, "b"=>2, "c"=>3} 

# Map hash to local variables 
@b = binding 
@h.each { |k,v| eval("#{k}_new = #{v + 100}", @b) } 

local_variables.grep(/^[a-z]\w*/) 
=> ["a", "b", "c", "a_new", "b_new", "c_new"] 

[a_new, b_new, c_new] 
=> [101, 102, 103] 
+1

這不工作在1.9 – texasbruce

+1

''#{ordinary_code_injection_warning}「' – DigitalRoss

+0

這在Ruby 1.9中不起作用,因爲在'eval'中聲明的任何局部變量的作用域限於'eval'本身。 –

2

你大概已經知道了,但備案:如果你願意做實例變量,而不是當地人則此功能將工作:

def f x 
    x.each do |k, v| 
    instance_variable_set "@#{k}", v 
    end 
end 

f :abc => 123, 'def' => 456 

> @abc 
=> 123 
> @def 
=> 456