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

在哪里:

myitem 是一个包含数组或配对对象的类(配对对象中有两个字段,一个和两个)

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

4

3 回答 3

1

从一个空映射开始,将 b.one 键的值设置为 b.two。

换句话说,对于“myitem”集合中的每个项目,创建一个映射条目。键将是项目的“一”值。该地图条目的值将是该项目的“二”值。

给“注入”的块接收两个参数。第一个是“累加器”。在这种情况下,它的初始值是传递给“inject”的空映射。第二个参数是集合中的当前项。在这种情况下,集合中的每个项目。

该块必须返回将用作下一个累加器值的任何内容,在本例中为映射。我们希望继续使用同一个映射,所以当我们完成后,“inject”方法将返回包含所有键/值对的映射。

如果不保存注入的结果,它有点毫无价值。

于 2011-12-05T15:46:51.140 回答
1

这是一种迂腐的写作方式

h = {}
myitem.each { |b| h[b.one] = b.two }

或者更接近您的原始代码

a = {}
mytem.each { |b| a[b.one] = b.two }

(我个人讨厌这种模式(以及使用它的人),因为它最后需要; a,失去注入的所有功能方面。(在“功能模式”中使用副作用函数,然后意识到后面的函数(a[..]) 不返回预期的对象是错误的,IMO)。

Inject 通常用于将列表“折叠”成类似的结果

[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

ETC ...

于 2011-12-05T15:48:38.247 回答
0
Hash[my_item.map {|object| [object.one, object.two]}]

是另一种方法。

于 2011-12-05T22:34:01.693 回答