このnanapiのブログ記事を見たときに
詳しい内容は記事を読んでいただくとして、こんなコードが出てきました。
def stringify(matrix)
matrix
.reduce('') do |result, a|
result
<< a.map(&:to_s)
.map { |v| v.rjust(4) }
.join('|')
<< "\n"
end
end
表示用に文字列を加工するメソッドなんですが、.reduce('')
を使ってるんですよねー。
ん、reduce
って例えば
(5..10).reduce() do |sum, value|
sum + value
end
=> 45
# もしくは
(5..10).reduce(:+)
=> 45
こんな感じで合計値を出すときに使うと便利、みたいな感じじゃないん?と思って調べてみるとこんな記事を発見。
(5..10).reduce(0) do |sum, value|
sum + value
end
引数がInitial valueになるんですよねー。上記の記事の解説を引用させていただくと
- Collection: 5, 6, 7, 8, 9, 10
- Initial Value: 0
- Function: add current value to running total
Pass # | Collection Value | Running Total | Return Value |
---|---|---|---|
1 | 5 | 0 (initializer value) | 5 |
2 | 6 | 5 | 11 |
3 | 7 | 11 | 18 |
4 | 8 | 18 | 26 |
5 | 9 | 26 | 35 |
6 | 10 | 35 | 45 |
こういうことなんですね。
そこで冒頭のコードをコメント付きで引用しますと
def stringify(matrix)
matrix
.reduce('') do |result, a| # 文字列に畳み込む
result
<< a.map(&:to_s) # 要素を文字列化して
.map { |v| v.rjust(4) } # スペースパディングして右寄せして
.join('|') # | で連結した文字列を結果に詰める
<< "\n" # 改行して区切る
end
end
文字列を返しているわけなので('')
にすると。
ちょい試してみると
(5..10).reduce('') do |sum, value|
sum.to_s + value.to_s
end
=> "5678910"
こうなるわけですね。ちなみに
(5..10).reduce(1) do |sum, value|
sum + value
end
=> 46
1から始まるわけなので当然結果もプラス1で返ってます。