很难理解&实现一些Ruby代码

时间:2011-12-05 15:41:53

标签: ruby inject

myitem.inject({}) {|a,b| a[b.one] = b.two; a}

其中:

myitem是一个包含数组或对象对象的类(对象对象有两个字段,分别为1和2)

我不确定上面的代码应该做什么?

3 个答案:

答案 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是列表中的每个值,0sum的初始值。

[2,3].inject(10) { |p,x| p*x }
=> 60 # 10*2*3
等等......

答案 2 :(得分:0)

Hash[my_item.map {|object| [object.one, object.two]}]

是另一种方法。