0

次のような配列を定義しました。

ary = [[0,1], [2,3]]

次のコードを実行します。

ary.reduce(nil) do |a, i, k|
  puts "#{a.inspect} #{i.inspect} #{k.inspect}"
end

各反復で、変数ai、およびkがそれぞれアキュムレータ ( nil) の値、内部配列の最初の要素、および 2 番目の要素を保持することを期待します。つまり、次の出力が期待されます。

nil 0 1
nil 2 3

しかし、代わりに結果は次のようになります。

nil [0, 1] nil
nil [2, 3] nil

なんで?望む結果を得るにはどうすればよいですか?

さらに、次のコードを使用するmapと、期待どおりに機能するのはなぜですか?

ary.map do |i, k|
  puts "#{i.inspect} #{k.inspect}"
end

# Output
# 0 1
# 2 3

違いはなんですか?

4

3 に答える 3

3

あなたはこれをしたい:

A.reduce(nil) { |a, (i, j)| p i }

mapとのデフォルトの動作の違いは、reduceRuby が単一の引数を受け取るブロックを処理する特別な方法によるものです。そのような場合 (つまりmap)、配列を分割しますが、複数の引数を受け取るブロック ( などreduce) の場合は、何をしたいのかを理解するのに助けが必要です。

于 2013-04-18T13:24:19.403 に答える