2015-04-01 44 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

相關問題