Ruby の初心者がお書きになった記事で,
to_s
は数値を文字列にするメソッドです
と書かれているものを非常によく目にします。
確かに
3.to_s # => "3"
0.1.to_s # => "0.1"
ですから,このメソッドは数値を文字列に変換しています。
にも関わらず引用した表現に引っかかりを感じるのは,数値以外のオブジェクトにも to_s
メソッドが使えるからです。
{朝: 3, 暮: 4}.to_s
# => "{:朝=>3, :暮=>4}"
Ruby に入門したての方は,
- 同名のメソッドが複数のクラスやモジュールに定義されていることがある
- そのうちのどのメソッドが呼び出されるかはレシーバーによって決まる
ということを早いうちに知っておかれるとよいと思います。
(メソッド呼び出しの)レシーバーというのは,上記のコードで言えばメソッド呼び出しの .
の前に書かれているオブジェクトのことです。
一般には,メソッド呼び出しの .
の前には式を書くことができ,その式を評価した結果として得られたオブジェクトがレシーバーとなります。たとえば,
(1 + 2).to_s
というコードであれば,「1 + 2
という式を評価して得られた 3
という Integer オブジェクト」が to_s
メソッドのレシーバーになります。
Ruby の組込みクラスの場合,to_s
はすべて「自身を表現する文字列オブジェクトを返す」という働きを持ちます。
どのように文字列表現を作るかはクラスごとに違っています。同じ数値クラスでも,Integer の to_s
と Float の to_s
は別のメソッドであり,前者が引数を取りうるのに対し,後者は引数を受け付けない,といった違いもあります。