如何递归地将哈希值转换为 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
我有一个看起来像这样的哈希:
{
: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