我有这个方法
def heights
(60..68).reduce({}) { |h, i| h.merge!( { %(#{i/12}'#{i%12}") => i } ) }
end
Run Code Online (Sandbox Code Playgroud)
它返回高度的哈希值
{
"5'0\"" => 60, "5'1\"" => 61, "5'2\"" => 62,
"5'3\"" => 63, "5'4\"" => 64, "5'5\"" => 65,
"5'6\"" => 66, "5'7\"" => 67, "5'8\"" => 68
}
Run Code Online (Sandbox Code Playgroud)
这就是我想要的.但是,我不喜欢使用这种merge!
方法.我更倾向于使用hash[key] = value
语法进行赋值:
def heights
(60..68).reduce({}) { |h, i| h[%(#{i/12}'#{i%12}")] = i }
end
Run Code Online (Sandbox Code Playgroud)
但是这段代码会引发错误.我知道使用reduce,在你的管道中你可以命名你的累加器和元素.
我也明白这一点
sum = 0
(1..5).each { |i| sum += i }
Run Code Online (Sandbox Code Playgroud)
相当于
(1..5).reduce(0) { |sum, i| sum + i }
Run Code Online (Sandbox Code Playgroud)
那么为什么不这样呢
hash = {}
(1..5).each { |i| hash[i.to_s] = i }
Run Code Online (Sandbox Code Playgroud)
工作相同
(1..5).reduce({}) { |hash, i| hash["#{i}"] = i }
Run Code Online (Sandbox Code Playgroud)
您可以使用each_with_object
而不是reduce
:
(60..68).each_with_object({}) { |i, h| h[%(#{i/12}'#{i%12}")] = i }
Run Code Online (Sandbox Code Playgroud)
enumerable.each_with_object(obj) { ... }
返回,obj
所以你不需要你需要; h
的块中的人工感觉reduce
.
请注意,块的参数顺序与不同reduce
.