Чтение и запись
Часть раздела Объектно-ориентированное программирование путешествия по Ruby на Coddy. Урок 7 из 57.
Написание метода чтения для каждой переменной экземпляра повторяется. attr_reader :title в теле класса создаёт метод title, который возвращает @title. В одной строке можно перечислить несколько имён:
class Book
attr_reader :title, :pages
def initialize(title, pages)
@title = title
@pages = pages
end
end
book = Book.new("Dune", 412)
puts book.title
puts book.pagesВывод:
Dune
412attr_writer :title генерирует сеттер, метод title=, который сохраняет свой аргумент в @title. Ruby позволяет вызывать его с использованием синтаксиса присваивания: book.title = "Emma":
class Book
attr_reader :title
attr_writer :title
def initialize(title)
@title = title
end
end
book = Book.new("Dune")
book.title = "Dune Messiah"
puts book.titleВывод:
Dune Messiahattr_accessor создаёт и средство чтения, и сеттер. Когда оба доступны, работает и сокращённая запись, например +=, потому что player.score += 5 означает player.score = player.score + 5:
class Player
attr_accessor :name, :score
def initialize(name)
@name = name
@score = 0
end
end
ada = Player.new("Ada")
ada.score += 5
ada.score += 3
ada.name = "Ada L."
puts "#{ada.name}: #{ada.score}"Вывод:
Ada L.: 8Открывай как можно меньше. Используй attr_reader для значений, которые внешний код может читать, но не изменять, и добавляй writer только там, где изменение значения извне предусмотрено дизайном. Присваивание атрибуту, доступному только для чтения, вызывает NoMethodError:
class Book
attr_reader :title
def initialize(title)
@title = title
end
end
book = Book.new("Dune")
begin
book.title = "Emma"
rescue NoMethodError => e
puts e.message
end
puts book.titleВывод:
undefined method `title=' for an instance of Book
DuneЗадание
ЛегкоЗавершите класс Book. Внешний код может читать title, author и pages, а также читать и изменять pages_read, начальное значение которого равно 0. progress возвращает Dune: 120/412 (29%), при этом процент округляется вниз.
Предоставленный код создаёт книгу из первых трёх строк ввода (название, автор, количество страниц). Каждая последующая строка содержит количество страниц, которые читатель успел прочитать; код добавляет каждое значение с помощью book.pages_read += n. В конце он выводит Dune by Frank Herbert и прогресс.
Ваш код должен находиться в book.rb. В main.rb содержится предоставленный код ввода/вывода, и его нельзя редактировать.
Попробуйте сами
require_relative 'book'
# Предоставленный код ввода/вывода: оставьте его как есть
input = []
while (line = gets)
input << line.chomp
end
book = Book.new(input[0], input[1], input[2].to_i)
input.drop(3).each { |n| book.pages_read += n.to_i }
puts "#{book.title} by #{book.author}"
puts book.progress
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
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