如何递归地将哈希值转换为lambdas?

时间:2015-04-01 13:09:21

标签: ruby 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在这种情况下,只有它&# 39; s键的值应该是lambda,除非它们也是一个哈希值)并且对它进行处理,但它变得非常麻烦。

1 个答案:

答案 0 :(得分: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