Menu
CoddyTech

to_sとinspect

CoddyのRubyジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 5/57。

putsはオブジェクトのto_sメソッドを呼び出して、オブジェクトをテキストに変換します。デフォルトのto_sは、#<Book:0x000055d0>のようにクラス名とメモリアドレスだけを返すため、クラスは独自のものを定義します。文字列補間でもto_sが呼び出されます。

class Book
  def initialize(title, pages)
    @title = title
    @pages = pages
  end

  def to_s
    "#{@title} (#{@pages} pages)"
  end
end

book = Book.new("Dune", 412)
puts book
puts "Reading #{book}"

出力:

Dune (412 pages)
Reading Dune (412 pages)

joinは各要素に対してもto_sを呼び出すため、オブジェクトの配列も自分で定義した形式で出力されます。

class Book
  def initialize(title)
    @title = title
  end

  def to_s
    @title.upcase
  end
end

shelf = [Book.new("Dune"), Book.new("Emma")]
puts shelf.join(", ")
puts "Shelf: #{shelf.join(" / ")}"

出力:

DUNE, EMMA
Shelf: DUNE / EMMA

pはプログラマー向けです。値を曖昧さなく表示するinspectを出力します。文字列は引用符が付いたままで、nilも表示されます。独自のオブジェクトでは、デフォルトのinspectはインスタンス変数を列挙します。

p "Dune"
puts "Dune"
p [1, "a", nil]
puts [1, "a", nil].inspect

出力:

"Dune"
Dune
[1, "a", nil]
[1, "a", nil]

デバッグ用に短く正確な説明を得るには、inspectをオーバーライドします。pと配列のinspectはそれを使いますが、putsは引き続きto_sを使います。

class Point
  def initialize(x, y)
    @x = x
    @y = y
  end

  def to_s
    "(#{@x}, #{@y})"
  end

  def inspect
    "#<Point x=#{@x} y=#{@y}>"
  end
end

pt = Point.new(1, 2)
puts pt
p pt
p [pt, Point.new(0, 5)]

出力:

(1, 2)
#<Point x=1 y=2>
[#<Point x=1 y=2>, #<Point x=0 y=5>]
challenge icon

チャレンジ

簡単

Trackクラスを完成させてください。initialize(title, artist, seconds)は値を保存します。to_sは、長さを分単位と2桁の秒数で表したDune by Ada (3:05)を返し、inspectはタイトルを二重引用符で囲んだ#<Track "Dune" 185s>を返します。

用意されたコードは、title,artist,secondsの形式の行としてトラックを読み込み、それぞれをputsで出力した後、リスト全体をpで出力します。

コードはtrack.rbに記述してください。main.rbには用意された入出力コードがあり、編集できません。

自分で試してみよう

require_relative 'track'

# 提供された入出力コード:そのままにしてください
input = []
while (line = gets)
  input << line.chomp
end
tracks = input.map do |line|
  title, artist, seconds = line.split(",")
  Track.new(title, artist, seconds.to_i)
end
tracks.each { |t| puts t }
p tracks
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: Rubyオンラインコンパイラ