使用 时Enumerable#inject
,大多数时候,我们希望结果与作为inject
. 例如,我们像这样使用它:
[1, 2, 3, 4, 5]
.inject(5){|i, e| i += e}
# => 20
[3, 4, 5]
.inject(1 => 1, 2 => 1){|h, e| h[e] = h[e - 1] + h[e - 2]; h}
# => {1=>1, 2=>1, 3=>2, 4=>3, 5=>5}
从这个操作取初值并修改成最终输出来看,以初值作为接收者,这样写会更自然:
5
.foo([1, 2, 3, 4, 5]){|i, e| i += e}
# => 20
{1 => 1, 2 => 1}
.foo([3, 4, 5]){|h, e| h[e] = h[e - 1] + h[e - 2]; h}
# => {1=>1, 2=>1, 3=>2, 4=>3, 5=>5}
whereObject#foo
将被定义为
def foo enum, ≺ enum.inject(self, &pr) end
在某些类似于此的库中是否有现成的方法foo
?