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 / EMMAp はプログラマー向けです。値を曖昧さなく表示する 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>]チャレンジ
簡単クラス Trackを完成させてください。initialize(title, artist, seconds)は値を保存します。to_sはDune by Ada (3:05)を返します。長さは分と2桁の秒数で表します。また、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
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Rubyオンラインコンパイラ