を使用する場合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}
どこでObject#foo
次のように定義されますか
def foo enum, ≺ enum.inject(self, &pr) end
これに似たライブラリに既製のメソッドはありfoo
ますか?