Ruby range.reduce与哈希累加器

我有这个方法

def heights
  (60..68).reduce({}) { |h,i| h.merge!( { %(#{i/12}'#{i%12}") => i } ) }
end

它返回高度的哈希值

{
  "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
}

这就是我想要的.但是,我不喜欢使用合并!方法.我更倾向于使用hash [key] = value语法进行赋值:

def heights
  (60..68).reduce({}) { |h,i| h[%(#{i/12}'#{i%12}")] = i }
end

但是这段代码会抛出错误.我知道使用reduce,在你的管道中你可以命名你的累加器和元素.

我也明白这一点

sum = 0
(1..5).each { |i| sum += i }

相当于

(1..5).reduce(0) { |sum,i| sum + i }

那么为什么不这样呢

hash = {}
(1..5).each { |i| hash[i.to_s] = i }

工作相同

(1..5).reduce({}) { |hash,i| hash["#{i}"] = i }

解决方法

减少块应该返回新的累加器.在你的情况下

(1..5).reduce({}) { |hash,i| hash["#{i}"] = i }

block返回i,这是一个整数,因此在第二次迭代时,您将尝试在整数上调用[].你需要它:

(1..5).reduce({}) { |hash,i| hash["#{i}"] = i; hash }

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...