2015-04-01 53 views
-1

我有一个哈希看起来像这样:如何将哈希值转换为lambda表达式?

 { 
     :a => "700", 
     :b => "600", 
     :c => "500", 
     :d => "400", 
     :e => "300", 
     :f => { 
     :g => "200", 
     :h => [ 
      "test" 
     ] 
     } 
    } 

我的目标是要遍历这个哈希和返回副本有包裹在一个lambda所有的值,与此类似:https://github.com/thoughtbot/paperclip/blob/dca87ec5d8038b2d436a75ad6119c8eb67b73e70/spec/paperclip/style_spec.rb#L44

我与each_with_object({})一起去了,但我能做的最好的只是包装第一级,所以我试图检查当我遇到另一个哈希周期(:f在这种情况下,只有它的键值应该是lambda,除非他们是一个哈希以及)并对待它,但它变得相当麻烦。

回答

1
def hash_values_to_lambda(old_hash) 
    {}.tap do |new_hash| 
    old_hash.each do |key, value| 
     new_hash[key] = 
     if value.is_a?(Hash) 
      hash_values_to_lambda(value) 
     else 
      lambda { value } # or -> { value } with new syntax 
     end 
    end 
    end 
end 

如果你愿意,你可以用each_with_object而不是tap去:

old_hash.each_with_object({}) do |(key, value), new_hash| 
    # everything else remains the same 
end 
+0

感谢,完美的作品,我学到新的东西。干杯 – 2015-04-01 13:42:22