割と悩んだので。
ベクトル和的なことやりたいとき
arr1 = [1, 2, 3]
arr2 = [4, 5, 6]
[arr1, arr2].transpose.map { |ele| ele.inject(:+) }
# => [5, 7, 9]
transpose
配列縦に並べていって列要素ごとに新しい配列返す
配列の長さ違うとエラーになるのでzipにする
[[1, 2, 3], [4, 5, 6], [7, 8, 9]].transpose
# [1, 2, 3]
# [4, 5, 6]
# [7, 8, 9]
# 列要素ごとに新しい配列返す
# => [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
# これはエラー
[[1, 2, 3], [4, 5]].transpose
inject
最初の要素と次の要素に対してメソッド実行、戻り値とその次の要素でメソッド実行、・・・で最後に結果返す
初期値指定もできる
# 初期値なし
[1, 2, 3, 4].inject(:+)
# 1 + 2 => 3
# 3 + 3 => 6
# 6 + 4 => 10
# => 10
# 初期値あり
[1, 2, 3, 4].inject(5, :+)
# 5 + 1 => 6
# 6 + 2 => 8
# 8 + 3 => 11
# 11 + 4 => 15
# => 15
最初のやつは
arr1 = [1, 2, 3]
arr2 = [4, 5, 6]
[arr1, arr2].transpose.map { |ele| ele.inject(:+) }
# transpose実行後
# [[1, 4], [2, 5], [3, 6]].map { |ele| ele.inject(:+) }
#
# mapで以下が実行されて戻り値が配列に格納される
# [1, 4].inject(:+)
# [2, 5].inject(:+)
# [3, 6].inject(:+)
# => [5, 7, 9]