Ruby の Array#* がこんな挙動をするとは知らなかったよ。いつからだろう。
試してみる。
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 のほうが優先されるみたいだ。