2012-12-12 5 views
2

Ruby에서 현재 바인딩에 변수/해시를 생성/추출하는 방법은 무엇입니까? 예를 들어 는 NameError에서 다음과 같은 결과 :Ruby의 현재 바인딩에 변수/해시를 생성/추출하는 방법은 무엇입니까?

class Hash 
    def extract(b) 
    self.each do |key, value| 
     bind = b.eval <<-END 
     #{key} = nil 
     proc { |value| #{key} = value } 
     END 
     bind.call(value) 
    end 
    end 
end 

hash = {:a => 1} 
hash.extract(binding) 
puts a 

주목할만한 대한 언급은 Kernel#binding 호출 할 때마다 내가 정말 을 변경 아니에요하는 호출자의 바인딩을 생각하게 다른 Binding 개체 인스턴스를 반환 Hash#extract입니다. 예를 들어, 작품을 다음

class Hash 
    def extract(b) 
    self.each do |key, value| 
     bind = b.eval <<-END 
     #{key} = nil 
     proc { |value| #{key} = value } 
     END 
     bind.call(value) 
    end 
    end 
end 

hash = {:a => 1} 
b = binding 
hash.extract(b) 
eval('puts a', b) 

답변

1

나는 메서드에 전달 된 현재의 바인딩 후 호출자의 실행 컨텍스트 내에서 표시지역 변수를 만드는 방법을 확실 해요 (예를 들어, #export_to, 아래) . 그러나 비슷한 피상적 같은 효과를 얻을 것이다 수행 할 수 있습니다

class Hash 
    def export_to(o) 
    each do |key, value| 
     o.define_singleton_method(key) { value } 
    end 
    end 
end 

hash = {:a => 1} 
hash.export_to self 
puts a 

selfbinding보다는 전달되는합니다.

또한 여기에서 공통 패턴이 방법 대신 인스턴스 변수를 설정하는 경우 puts 이상 코드가 현재 @a를 참조 할 수있을 것이다되어 있습니다.

관련 문제