2016-12-12 6 views
4

そうのような独特の要素に、配列のすべての要素を結合するネイティブな方法がありますブロックの配列に参加私は私の配列にハッシュを使用したことは一例であり、私が言うことができる:ネイティブ

[ 
    0, 
    1, 
    2, 
    3 
].join do | x, y | 
    x + y 
end 

は値として6で終了します。

答えて

5

Enumerable#injectこれらの場合の両方をカバーする:

a = [{a: "a"}, {b: "b"}] 
a.inject(:merge) #=> {:a=>"a", :b=>"b"} 
b = [0, 1, 2, 3] 
b.inject(:+) #=> 6 

inject "和" で提供される方法を使用してアレイを。最初のケースでは、合計と現在の要素の「加算」はマージによって行われ、2番目のケースでは加算によって行われます。

アレイが空の場合、injectnilを返します。返すようにするには、初期値(thanks @Hellfar)を指定してください:

[].inject(0, :+) #=> 0 
+0

私はあなたの答えを理解していますが、私はそれを試してみましたが、初期値(ハッシュのため)を忘れてしまいました。 – Hellfar

+1

@Hellfar:私は '注射'の振る舞いを誤って思い出しました。デフォルトでは配列の最初の値が初期値として使用され、ゼロではないため、コードが機能する理由が説明されます。私は答えを更新しました。 – Linuxios

+0

最後に、初期値が必要な理由はまだあります:)。配列が空の場合、 'inject'の返り値は' nil'になりますが、期待できない場合もあります。 – Hellfar

3
[ 
    {a: "a"}, 
    {b: "b"} 
].inject({}){|sum, e| sum.merge e} 
+0

'[...] inject {| sum、e | sum.merge e} 'で十分です。 @Linuxiosの答えに対するコメントを見てください。 –

関連する問題