myitem.inject({}) {|a,b| a[b.one] = b.two; a}
其中:
myitem是一个包含数组或对象对象的类(对象对象有两个字段,分别为1和2)
我不确定上面的代码应该做什么?
答案 0 :(得分:1)
从空地图开始,将b.one键的值设置为b.two。
换句话说,对于“myitem”集合中的每个项目,都要创建一个地图条目。密钥将是项目的“一个”值。该映射条目的值将是项目的“两个”值。
给予“inject”的块接收两个参数。第一个是“累加器”。在这种情况下,它的初始值是传递给“inject”的空映射。第二个参数是集合中的当前项。在这种情况下,集合中的每个项目。
该块必须返回将用作 next 累加器值的任何内容,在本例中为map。我们希望继续使用相同的地图,所以当我们完成后,“inject”方法将返回包含所有键/值对的地图。
如果不保存注入的结果,它就会毫无价值。
答案 1 :(得分:1)
这是一种迂腐的写作方式
h = {}
myitem.each { |b| h[b.one] = b.two }
或更接近原始代码
a = {}
mytem.each { |b| a[b.one] = b.two }
(我个人讨厌这种模式(以及使用它的人),因为它最终需要; a
,失去了注入的所有功能方面。(在'功能模式'中使用副作用函数,然后意识到后面的函数(a [..])没有返回期望的对象是错的,IMO)。
注入是将列表“折叠”为
之类的结果的正常用法[1,2,3].inject(0) { |sum, x| sum+x }
=> 6 # (0+1+2+3)
此处sum
是上次调用阻止的结果,x
是列表中的每个值,0
是sum
的初始值。
[2,3].inject(10) { |p,x| p*x }
=> 60 # 10*2*3
等等......
答案 2 :(得分:0)
Hash[my_item.map {|object| [object.one, object.two]}]
是另一种方法。