どうもこんにちは。
今回は、puts
メソッドは内部的にto_s
メソッドを呼び出しているということに疑問を覚えたので、勉強しました。
to_sメソッドとは
to_s
メソッドは、数値などのオブジェクトを文字列に変換するメソッドです。
num = 123
puts num.to_s #=> "123"
putsメソッドがto_sメソッドを呼び出す仕組み
puts
メソッドは、引数として渡されたオブジェクトを出力する際に、そのオブジェクトのto_s
メソッドを自動的に呼び出して文字列に変換します。
これは、Rubyのメソッド呼び出しの内部動作によるもので、ユーザーが明示的にto_s
を呼び出さなくても、puts
が自動的に処理してくれます。
Ruby リファレンスマニュアルには、以下のように記載されています。
引数と改行を順番に 標準出力 $stdout に出力します。引数がなければ改行のみを出力します。
引数が配列の場合、その要素と改行を順に出力します。配列や文字列以外のオブジェクトが引数として与えられた場合には、当該オブジェクトを最初に to_ary により配列へ、次に to_s メソッドにより文字列へ変換を試みます。末尾が改行で終っている引数や配列の要素に対しては puts 自身は改行を出力しません。
ということは、puts
はこんな感じで定義されてそう?
putsの予想定義コード
def puts(*args)
args.each do |arg|
if arg.nil?
print "\n"
else
print "#{arg.to_s}\n"
end
end
end
多分こんな感じだと思うです...!
to_sが自動的に呼び出すメソッド例
- 文字列補間 #{}
- Loggerクラスのメソッド
- info
- error
- debug
to_sメソッドをオーバーライドすれば自分の見やすい形で文字列出力できそう!
class Book
def initialize(title, author)
@title = title
@author = author
end
def to_s
"「#{@title}」 by #{author}"
end
end
book = Book.new("吾輩は猫である", "夏目漱石")
puts book
# => 「吾輩は猫である」 by 夏目漱石
できたー!