Menu
Coddy logo textTech

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 / EMMA

p è 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].inspect

Output:

"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>]
challenge icon

Sfida

Facile

Completa 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
quiz iconMettiti alla prova

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

Esercitati da solo: Compilatore Ruby online