to_s e inspect
Parte da seção Programação orientada a objetos do Journey de Ruby da Coddy. Lição 5 de 57.
puts transforma um objeto em texto chamando seu método to_s. O to_s padrão fornece apenas o nome da classe e um endereço de memória, como #<Book:0x000055d0>, então as classes definem o próprio. A interpolação de strings também chama 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}"Saída:
Dune (412 pages)
Reading Dune (412 pages)join também chama to_s em cada elemento, portanto um array dos seus objetos é impresso no seu 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(" / ")}"Saída:
DUNE, EMMA
Shelf: DUNE / EMMAp é para programadores: ele imprime inspect, que mostra um valor sem ambiguidades. Uma string mantém suas aspas e nil fica visível. Para seus próprios objetos, o inspect padrão lista as variáveis de instância:
p "Dune"
puts "Dune"
p [1, "a", nil]
puts [1, "a", nil].inspectSaída:
"Dune"
Dune
[1, "a", nil]
[1, "a", nil]Substitua inspect para obter uma descrição curta e exata para depuração. p e o inspect de um array passam a usá-la, enquanto puts continua 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)]Saída:
(1, 2)
#<Point x=1 y=2>
[#<Point x=1 y=2>, #<Point x=0 y=5>]Desafio
FácilComplete a classe Track. initialize(title, artist, seconds) armazena os valores. to_s retorna Dune by Ada (3:05), com a duração em minutos e os segundos com dois dígitos, e inspect retorna #<Track "Dune" 185s>, com o título entre aspas duplas.
O código fornecido lê as faixas como linhas no formato title,artist,seconds, imprime cada uma com puts e depois imprime a lista inteira com p.
Seu código deve ficar em track.rb. main.rb contém o código fornecido de entrada/saída e não pode ser editado.
Experimente você mesmo
require_relative 'track'
# Código de entrada/saída fornecido: mantenha-o 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 lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação orientada a objetos
1Classes e Objetos
Trabalhando com ArquivosDefinindo ClassesVariáveis de InstânciaMétodos e selfto_s e inspectRevisão - Cartão da Biblioteca4Encapsulamento
Métodos privadosMétodos protegidosSetters privadosProtegendo o estadoRevisão - Máquina de venda automática7Polimorfismo e Duck Typing
PolimorfismoDuck TypingMétodos Abstratoscase e ClassesRevisão - Métodos de Pagamento2Acessores e self
Leitores e GravadoresSetters Personalizadosself nos MétodosIdentidade e IgualdadeRecapitulação - Lista de Contatos5Herança
SubclassesSobrescrita de métodosChamando superis_a? e ancestraisRevisão - Folha de pagamento da equipe8Métodos Especiais
Igualdade e hashMétodos de OperadoresIndexação e AdiçãoColeções PersonalizadasRevisão - Frações11Projeto: Gerenciamento de Biblioteca
Livros e MembrosEmpréstimo de LivrosPratique por conta própria: Compilador de Ruby online