Определение классов
Часть раздела Объектно-ориентированное программирование путешествия по Ruby на Coddy. Урок 2 из 57.
Класс описывает разновидность объекта: что он знает и что умеет делать. class Dog ... end объявляет класс, а Dog.new создаёт объект этого класса — экземпляр. Метод, определённый с помощью def внутри класса, можно вызвать для каждого экземпляра:
class Dog
def speak
"Woof"
end
end
rex = Dog.new
puts rex.speak
puts rex.classВывод:
Woof
Dognew создаёт объект, а затем вызывает его метод initialize с аргументами, которые вы передали в new. initialize настраивает объект, обычно сохраняя аргументы в переменных экземпляра, имена которых начинаются с @:
class Dog
def initialize(name)
@name = name
end
def speak
"#{@name} says Woof"
end
end
puts Dog.new("Rex").speak
puts Dog.new("Bella").speakРезультат:
Rex says Woof
Bella says WoofМетоды принимают аргументы, как любой метод Ruby, и возвращают значение своего последнего выражения. Каждый вызов new создаёт отдельный объект:
class Calculator
def add(a, b)
a + b
end
def average(numbers)
numbers.sum.to_f / numbers.size
end
end
calc = Calculator.new
puts calc.add(2, 3)
puts calc.average([1, 2, 3, 6])Вывод:
5
3.0Имена классов — это константы, записанные в CamelCase (BankAccount); имена методов и переменных используют snake_case (deposit_money). new проверяет свои аргументы по сравнению с initialize, поэтому отсутствие аргумента вызывает ArgumentError:
class Point
def initialize(x, y)
@x = x
@y = y
end
end
begin
Point.new(1)
rescue ArgumentError => e
puts e.message
endВывод:
wrong number of arguments (given 1, expected 2)Задание
ЛегкоЗавершите класс Formatter. Его метод title(text) возвращает текст, в котором каждое слово написано с заглавной буквы (the hobbit даёт The Hobbit), slug(text) возвращает слова в нижнем регистре, соединённые с помощью - (the-hobbit), а initials(text) возвращает первую букву каждого слова в верхнем регистре (TH).
Предоставленный код создаёт один объект Formatter и для каждой входной строки выводит три результата в отдельных строках.
Ваш код должен находиться в formatter.rb. В файле main.rb содержится предоставленный код ввода/вывода, и его нельзя изменять.
Попробуйте сами
require_relative 'formatter'
# Предоставленный код ввода/вывода: оставьте его как есть
input = []
while (line = gets)
input << line.chomp
end
formatter = Formatter.new
input.each do |line|
puts formatter.title(line)
puts formatter.slug(line)
puts formatter.initials(line)
end
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
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