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 / EMMAp 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].inspectAusgabe:
"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>]Aufgabe
EinfachVervollstä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
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Klassen und Objekte
Arbeiten mit DateienKlassen definierenInstanzvariablenMethoden und selfto_s und inspectRückblick – Bibliotheksausweis4Kapselung
Private MethodenGeschützte MethodenPrivate SetterZustand schützenRückblick – Verkaufsautomat7Polymorphismus und Duck Typing
PolymorphismusDuck TypingAbstrakte MethodenFälle und KlassenRückblick – Zahlungsmethoden2Getter und Setter sowie self
Leser und SchreiberBenutzerdefinierte Setterself in MethodenIdentität und GleichheitWiederholung – Kontaktliste5Vererbung
UnterklassenMethoden überschreibensuper aufrufenis_a? und VorfahrenRückblick – Gehaltsabrechnung des Personals8Spezielle Methoden
Gleichheit und HashOperator-MethodenIndexieren und AnhängenBenutzerdefinierte CollectionsRückblick – Brüche11Projekt: Bibliotheksverwaltung
Bücher und MitgliederBücher ausleihenÜbe selbstständig: Online-Ruby-Compiler