3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Ruby】putsメソッドは内部的にto_sメソッドを呼び出している!?

Last updated at Posted at 2024-11-04

どうもこんにちは。

今回は、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が自動的に呼び出すメソッド例

  • print
  • 文字列補間 #{}
  • 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 夏目漱石

できたー!

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?