to_s e inspect
Parte de la sección Programación orientada a objetos del Journey de Ruby de Coddy. Lección 5 de 57.
puts convierte un objeto en texto llamando a su método to_s. El to_s predeterminado solo proporciona el nombre de la clase y una dirección de memoria, como #<Book:0x000055d0>, por lo que las clases definen el suyo propio. La interpolación de cadenas también llama a 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}"Salida:
Dune (412 pages)
Reading Dune (412 pages)join también llama a to_s en cada elemento, por lo que un array de tus objetos se imprime con tu 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(" / ")}"Salida:
DUNE, EMMA
Shelf: DUNE / EMMAp es para programadores: imprime inspect, que muestra un valor de forma inequívoca. Una cadena conserva sus comillas y nil es visible. Para tus propios objetos, el inspect predeterminado enumera las variables de instancia:
p "Dune"
puts "Dune"
p [1, "a", nil]
puts [1, "a", nil].inspectSalida:
"Dune"
Dune
[1, "a", nil]
[1, "a", nil]Reemplaza inspect para obtener una descripción breve y exacta para la depuración. p y el inspect de un arreglo lo usan después, mientras que puts sigue usando 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)]Salida:
(1, 2)
#<Point x=1 y=2>
[#<Point x=1 y=2>, #<Point x=0 y=5>]Desafío
FácilCompleta la clase Track. initialize(title, artist, seconds) almacena los valores. to_s devuelve Dune by Ada (3:05), con la duración expresada en minutos y segundos de dos dígitos, y inspect devuelve #<Track "Dune" 185s>, con el título entre comillas dobles.
El código proporcionado lee las pistas como líneas con el formato title,artist,seconds, imprime cada una con puts y después imprime la lista completa con p.
Tu código va en track.rb. main.rb contiene el código proporcionado de entrada/salida y no se puede editar.
Pruébalo tú mismo
require_relative 'track'
# Código de entrada/salida suministrado: mantenlo tal como está
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
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación orientada a objetos
1Clases y objetos
Trabajar con archivosDefinir clasesVariables de instanciaMétodos y selfto_s e inspectRepaso: tarjeta de biblioteca4Encapsulación
Métodos privadosMétodos protegidosAsignadores privadosProtección del estadoRepaso: máquina expendedora7Polimorfismo y tipado pato
PolimorfismoTipado patoMétodos abstractoscase y clasesRepaso: métodos de pago2Accesores y self
Lectores y escritoresSetters personalizadosself en los métodosIdentidad e igualdadRepaso: lista de contactos5Herencia
SubclasesSobrescritura de métodosLlamar a superis_a? y ancestrosRepaso - Nómina del personal8Métodos especiales
Igualdad y hashMétodos de operadoresIndexación y adiciónColecciones personalizadasRepaso: fracciones11Proyecto: Gestión de biblioteca
Libros y miembrosPréstamo de librosPractica por tu cuenta: Compilador de Ruby online