Ruby の Array#* がこんな挙動をするとは知らなかったよ。いつからだろう。
cf. Rubyにおける算術演算の基礎 – hp12c
試してみる。
irb(main):001:0> [1,2,3,4,5] * ","
=> "1,2,3,4,5"
パラメータが文字列の場合は、それをセパレータとして連結するってこと。Array#join と同じだってマニュアルにも書いてある。
cf. http://doc.ruby-lang.org/ja/1.9.3/class/Array.html
上記のマニュアルには、「(パラメータが)文字列以外のオブジェクトを指定した場合は to_str メソッドによる暗黙の型変換を試みます。」とも書いてある。
ところで Array#* のパラメータに整数を指定すると、配列を指定した整数回繰り返した配列を返す(これは当然知ってた)。で、マニュアルのその項には「(パラメータには)繰り返したい回数を整数で指定します。整数以外のオブジェクトを指定した場合は to_int メソッドによる暗黙の型変換を試みます。」って書いてある。
じゃあ、to_s と to_int の両方を持ったオブジェクトをパラメータにしたらどうなるんだろう。
irb(main):002:0> class Foo
irb(main):003:1> def to_s
irb(main):004:2> "3"
irb(main):005:2> end
irb(main):006:1> def to_int
irb(main):007:2> 3
irb(main):008:2> end
irb(main):009:1> end
=> nil
irb(main):010:0> foo = Foo.new
=> 3
irb(main):011:0> [1,2,3,4,5] * foo
=> [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
どうやら、to_int のほうが優先されるみたいだ。