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

How do I convert a hash's values into lambdas recursively?

我有一个看起来像这样的哈希:

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

我的目标是迭代这个散列和 return 一个包含所有值的 lambda 副本,类似于:https://github.com/thoughtbot/paperclip/blob/dca87ec5d8038b2d436a75ad6119c8eb67b73e70/spec/paperclip/style_spec.rb#L44

我选择了 each_with_object({}) 但我能做的最好的事情就是只包装第一层,所以我尝试检查我何时在循环中遇到另一个哈希(:f 在这种情况下,只有它的键的值应该是一个 lambda 除非它们也是一个散列)并对待它,但是它变得很麻烦。

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