2012-06-23 3 views
3

가능한 중복 :
Is there a Ruby equivalent to PHP's extract?상호 교환 해시 키와 루비의 지역 변수 이름

루비 해시를 취할 수있는 방법이 있나요 같은 :

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

및 이것을 로컬 변수 집합으로 변환하십시오 (할당을 수동으로 수행하는 것의 부족함, 분명히)? 마찬가지로

a = 12 
b = 24 
c = 36 

I 정의 된 로컬 변수의 세트를 가지고 키 변수 이름은 그 값은 변수 값 곳 (해시 할 수있다 : I가 문을 실행했을 때와 동일한 결과가 있어야 다시 말하면, 해쉬를 문자 그대로 쓰지 않는 것)?

+0

는, 거의 확실하게 더 나은 방법이있다. 다른 솔루션을 제안 할 수 있도록 자세한 정보를 제공 할 수 있습니까? –

+0

@ JoshuaCheek 중간 크기의 해시를 인수로 자주 전달하는 경우가 있습니다. 번거롭고 부풀어 오르는 것은 항상 해시 구문을 통해이 해시에 저장된 값에 액세스해야합니다. 내 방법 내에서 해시를 풀거나 추출 할 수 있다고 생각했지만, 돌려 주면 다시 포장하십시오. –

+0

대답은 OO를 받아들이는 것으로 의심됩니다. 해시가 옵션 인 경우 꺼내어 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

'eval'에 선언 된 지역 변수의 범위가'eval' 자체로 제한되어 있기 때문에 Ruby 1.9에서는 작동하지 않습니다. –

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