2012-12-12 64 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 

注意self被傳遞,而不是binding

另請注意,此處的常見模式是設置實例變量而不是方法,在這種情況下,puts和更高版本的代碼現在可以引用@a