RubyのArray#*

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 のほうが優先されるみたいだ。

カテゴリー: Ruby パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください