Menu
Coddy logo textTech

to_s und inspect

Teil des Abschnitts Objektorientierte Programmierung der Ruby-Journey von Coddy. Lektion 5 von 57.

puts wandelt ein Objekt in Text um, indem es dessen Methode to_s aufruft. Das standardmäßige to_s gibt nur den Klassennamen und eine Speicheradresse aus, etwa #<Book:0x000055d0>; daher definieren Klassen ihre eigene Methode. Auch die String-Interpolation ruft to_s auf:

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}"

Ausgabe:

Dune (412 pages)
Reading Dune (412 pages)

join ruft außerdem für jedes Element to_s auf, sodass ein Array deiner Objekte in deinem Format ausgegeben wird:

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(" / ")}"

Ausgabe:

DUNE, EMMA
Shelf: DUNE / EMMA

p ist für Programmierer gedacht: Es gibt inspect aus, das einen Wert eindeutig darstellt. Ein String behält seine Anführungszeichen, und nil ist sichtbar. Für deine eigenen Objekte listet das standardmäßige inspect die Instanzvariablen auf:

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

Ausgabe:

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

Überschreibe inspect, um eine kurze, genaue Beschreibung zum Debuggen zu erhalten. p und inspect eines Arrays verwenden es dann, während puts weiterhin to_s verwendet:

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)]

Ausgabe:

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

Aufgabe

Einfach

Vervollständige die Klasse Track. initialize(title, artist, seconds) speichert die Werte. to_s gibt Dune by Ada (3:05) zurück, wobei die Länge als Minuten und zweistellige Sekunden angegeben wird, und inspect gibt #<Track "Dune" 185s> zurück, wobei der Titel in doppelten Anführungszeichen steht.

Der bereitgestellte Code liest Tracks als Zeilen im Format title,artist,seconds ein, gibt jeden mit puts aus und gibt anschließend die gesamte Liste mit p aus.

Dein Code gehört in track.rb. main.rb enthält den bereitgestellten Eingabe-/Ausgabecode und darf nicht bearbeitet werden.

Probier es selbst

require_relative 'track'

# Gelieferter Ein-/Ausgabecode: belasse ihn wie er ist
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 iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-Ruby-Compiler