假设h
是问题中给出的散列,如果我对问题的理解是正确的,则以下方法将返回所需的散列。
def doit(h, color)
h.each_with_object({}) do |(k,f),g|
c,v = f.find { |kk,_| kk != "default" }
if c == color
g[k] = v.is_a?(Hash) ? v : {}
else
g[k] = f["default"]
end
end
end
doit(h, 'black')
#=> {"size"=>{"jeans"=>"boyfriend"}, "style"=>{"shoes"=>"boots"}}
doit(h, 'blue')
#=> {"size"=>{}, "style"=>{"jeans"=>"jeggings"}}
第二个例子的步骤如下。
color = 'blue'
enum = h.each_with_object({})
#=> #<Enumerator: {"size"=>{"default"=>{"jeans"=>"boyfriend"},
# "blue"=>"none"}, "style"=>{"default"=>{"shoes"=>"boots"},
# "blue"=>{"jeans"=>"jeggings"}}}:each_with_object({})>
此枚举的第一值时产生:
x = enum.next
#=> [["size", {"default"=>{"jeans"=>"boyfriend"}, "blue"=>"none"}], {}]
并传递给该块。块变量被设置等于x
和它们的值通过“消歧”确定:
(k,f),g = x
k #=> "size"
f ##=> {"default"=>{"jeans"=>"boyfriend"}, "blue"=>"none"}
g #=> {}
现在执行的块的计算。
c,v = f.find { |kk,_| kk != "default" }
#=> ["blue", "none"]
C#=> "blue"
v #=> "none"
由于
c == color
#=> "blue" == "blue" => true
我们计算
v.is_a?(Hash)
#=> false
,因此执行任务
g[k] = {}
#=> {}
以至于现在
g #=> {"size"=>{}}
h
的第二个也是最后一个元素现在生成并传递给该块。
x = enum.next
#=> [["style", {"default"=>{"shoes"=>"boots"},
# "blue"=>{"jeans"=>"jeggings"}}], {"style"=>{"jeans"=>"jeggings"}}]
(k,f),g = x
k #=> "style"
f #=> {"default"=>{"shoes"=>"boots"}, "blue"=>{"jeans"=>"jeggings"}}
g #=> {"size"=>"none"}
c,v = f.find { |kk,_| kk != "default" }
#=> ["blue", {"jeans"=>"jeggings"}]
C#=> "blue"
v #=> {"jeans"=>"jeggings"}
c == color
# "blue" == "blue" => true
v.is_a?(Hash)
#=> true
g[k] = v
#=> {"jeans"=>"jeggings"}
g #=> {"size"=>"none", "style"=>{"jeans"=>"jeggings"}}
和g
被返回。
你能提供一个你的代码样本吗? – JMichelB
你遇到什么问题?你的代码有什么问题?你有错误信息吗?什么是错误信息?你得到的结果不是你期待的结果吗?你期望得到什么结果?为什么?你得到的结果是什么?两者有什么不同?你正在观察的行为不是所期望的行为?什么是期望的行为,为什么,观察到的行为是什么,以及它们以何种方式不同?请提供[mcve]。 –
“做这件事的最好方法是什么?” - 你通过编写这样做的程序来做到这一点。如果您的程序有问题,请仔细阅读您正在使用的所有方法,类,模块和库的文档,为您的程序编写测试,使用笔和纸记录执行情况,单步执行调试程序,然后在上面睡觉,从头开始,再次睡上,然后*然后只有这样*问一个关于[so]的重点狭窄的问题。 –