to_s e inspect
Fa parte della sezione Programmazione orientata agli oggetti del percorso Ruby di Coddy. Lezione 5 di 57.
puts trasforma un oggetto in testo chiamando il suo metodo to_s. Il metodo to_s predefinito restituisce solo il nome della classe e un indirizzo di memoria, come #<Book:0x000055d0>, quindi le classi definiscono il proprio. Anche l’interpolazione di stringhe chiama 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}"Output:
Dune (412 pages)
Reading Dune (412 pages)join chiama anche to_s su ogni elemento, quindi un array dei tuoi oggetti stampa il risultato nel tuo formato:
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(" / ")}"Risultato:
DUNE, EMMA
Shelf: DUNE / EMMAp è per i programmatori: stampa inspect, che mostra un valore in modo inequivocabile. Una stringa mantiene le virgolette e nil è visibile. Per i tuoi oggetti, il comportamento predefinito di inspect elenca le variabili di istanza:
p "Dune"
puts "Dune"
p [1, "a", nil]
puts [1, "a", nil].inspectOutput:
"Dune"
Dune
[1, "a", nil]
[1, "a", nil]Sovrascrivi inspect per ottenere una descrizione breve e precisa per il debug. p e inspect di un array lo usano, mentre puts continua a usare 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)]Output:
(1, 2)
#<Point x=1 y=2>
[#<Point x=1 y=2>, #<Point x=0 y=5>]Sfida
FacileCompleta la classe Track. initialize(title, artist, seconds) memorizza i valori. to_s restituisce Dune by Ada (3:05), con la durata espressa in minuti e secondi a due cifre, e inspect restituisce #<Track "Dune" 185s>, con il titolo tra virgolette doppie.
Il codice fornito legge i brani da righe nel formato title,artist,seconds, stampa ciascuno con puts e poi stampa l’intera lista con p.
Il tuo codice va inserito in track.rb. main.rb contiene il codice di input/output fornito e non può essere modificato.
Provalo tu
require_relative 'track'
# Codice di input/output fornito: lascialo così com'è
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
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Classi e oggetti
Lavorare con i fileDefinire le classiVariabili d'istanzaMetodi e selfto_s e inspectRipasso - Tessera della biblioteca4Incapsulamento
Metodi privatiMetodi protettiSetter privatiProteggere lo statoRiepilogo - Distributore automatico7Polimorfismo e Duck Typing
PolimorfismoDuck TypingMetodi astratticase e classiRiepilogo - Metodi di pagamento10Pattern di progettazione Parte 2
Delegazione con ForwardablePattern DecoratorPattern BuilderPattern State2Metodi di accesso e self
Metodi di lettura e scritturaSetter personalizzatiself nei metodiIdentità e uguaglianzaRiepilogo - Elenco contatti5Ereditarietà
SottoclassiRidefinizione dei metodiChiamare superis_a? e antenatiRiepilogo - Paghe del personale8Metodi speciali
Uguaglianza e hashMetodi degli operatoriIndicizzazione e appendCollezioni personalizzateRiepilogo - Frazioni11Progetto: Gestione della biblioteca
Libri e iscrittiPrendere in prestito i libriEsercitati da solo: Compilatore Ruby online