Ruby で ["homu", "mami", "mado"].sum を呼ぶとエラーになる
今日の知見です。
Array#sum
メソッドは要素を #+
で結合してその結果を返します。
p [1, 3, 5, 7].sum # => 16
また Array#sum
に引数を渡すことで足し込む値の初期値を指定することもできます。
p [1, 3, 5, 7].sum(100) # => 116
["homu", "mami", "mado"].sum
を呼ぶとエラーになる
では要素が文字列の場合はどうでしょうか。
残念ながら要素が文字列の場合はエラーになってしまいます。
# error: `+': String can't be coerced into Integer (TypeError) pp ["homu", "mami", "mado"].sum
これは Array#sum
が内部で使用している初期値に問題があります。
Array#sum
は足し込むときの初期値として 0
を使用しています。
なので最初に足し込む際に 0 + "homu"
みたいな処理が実行されてしまいエラーになってしまいます。
これを回避する場合は Array#sum
に明示的に初期値 ""
を渡すことで回避することができます。
# OK pp ["homu", "mami", "mado"].sum("") # => "homumamimado" # 任意の要素を初期値にもできる pp ["homu", "mami", "mado"].sum("joined : ") # => "joined : homumamimado"
なぜエラーになるのかの原因がわかっているならいいんですがいきなり String can't be coerced into Integer (TypeError)
ってエラーになってもぎょっとしますよね。
ちなみに単に文字列を結合したい場合は Array#join
が利用できます。
pp ["homu", "mami", "mado"].join # => "homumamimado"