to_s и inspect
Часть раздела Объектно-ориентированное программирование путешествия по Ruby на Coddy. Урок 5 из 57.
puts превращает объект в текст, вызывая его метод to_s. Метод to_s по умолчанию выдаёт только имя класса и адрес в памяти, например #<Book:0x000055d0>, поэтому классы определяют собственную версию этого метода. Подстановка строк также вызывает 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}"Вывод:
Dune (412 pages)
Reading Dune (412 pages)join также вызывает to_s для каждого элемента, поэтому массив ваших объектов выводится в вашем формате:
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(" / ")}"Вывод:
DUNE, EMMA
Shelf: DUNE / EMMAp предназначен для программистов: он выводит inspect, который однозначно показывает значение. Строка сохраняет кавычки, а nil виден. Для ваших собственных объектов inspect по умолчанию перечисляет переменные экземпляра:
p "Dune"
puts "Dune"
p [1, "a", nil]
puts [1, "a", nil].inspectВывод:
"Dune"
Dune
[1, "a", nil]
[1, "a", nil]Переопределите inspect, чтобы получить краткое и точное описание для отладки. p и inspect массива затем используют его, тогда как puts продолжает использовать 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)]Результат:
(1, 2)
#<Point x=1 y=2>
[#<Point x=1 y=2>, #<Point x=0 y=5>]Задание
ЛегкоЗавершите класс Track. initialize(title, artist, seconds) сохраняет значения. to_s возвращает Dune by Ada (3:05), где длительность указана в минутах и секунды представлены двумя цифрами, а inspect возвращает #<Track "Dune" 185s>, заключая название в двойные кавычки.
Предоставленный код считывает треки в виде строк title,artist,seconds, выводит каждый с помощью puts, а затем выводит весь список с помощью p.
Ваш код должен находиться в track.rb. В main.rb находится предоставленный код ввода/вывода, и его нельзя редактировать.
Попробуйте сами
require_relative 'track'
# Предоставленный код ввода/вывода: оставьте его как есть
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
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Классы и объекты
Работа с файламиОпределение классовПеременные экземпляраМетоды и selfto_s и inspectПовторение — читательский билет4Инкапсуляция
Приватные методыЗащищённые методыПриватные сеттерыЗащита состоянияПовторение — торговый автомат7Полиморфизм и утиная типизация
ПолиморфизмУтиная типизацияАбстрактные методыcase и классыПовторение — способы оплаты10Шаблоны проектирования, часть 2
Делегирование с помощью ForwardableШаблон декоратораШаблон строителяШаблон состояния2Аксессоры и self
Чтение и записьПользовательские сеттерыself в методахИдентичность и равенствоПовторение — список контактов5Наследование
ПодклассыПереопределение методовВызов superis_a? и предкиПовторение — расчёт зарплаты сотрудников8Специальные методы
Равенство и хешированиеМетоды операторовИндексация и добавлениеПользовательские коллекцииПовторение — дроби11Проект: Управление библиотекой
Книги и читателиВыдача книг3Методы и переменные классов
Методы классовПеременные экземпляра классаКонстантыФабричные методыПовторение — коды купонов6Модули и примеси
Модули и includeРасширение объектовМодуль ComparableМодуль EnumerableПовторение — спортивная лига9Паттерны проектирования. Часть 1
Паттерн «Одиночка»Фабричный паттернПаттерн «Наблюдатель»Паттерн «Стратегия»Потренируйтесь самостоятельно: Онлайн-компилятор Ruby