Методы классов
Часть раздела Объектно-ориентированное программирование путешествия по Ruby на Coddy. Урок 12 из 57.
Метод класса принадлежит классу, а не отдельному экземпляру. В теле класса self — это класс, поэтому def self.name определяет метод класса. Вызывайте его непосредственно у класса:
class Temperature
def self.to_fahrenheit(celsius)
celsius * 9 / 5.0 + 32
end
end
puts Temperature.to_fahrenheit(100)
puts Temperature.to_fahrenheit(-40)Вывод:
212.0
-40.0Методы класса и методы экземпляра находятся в разных местах. Экземпляр не может напрямую вызвать метод класса; он обращается к нему через self.class или имя класса:
class Circle
def self.area_for(r)
(3.14159 * r * r).round(2)
end
def initialize(r)
@r = r
end
def area
self.class.area_for(@r)
end
end
puts Circle.area_for(1)
puts Circle.new(2).area
begin
Circle.new(2).area_for(2)
rescue NoMethodError => e
puts e.message
endВывод:
3.14
12.57
undefined method `area_for' for an instance of Circleclass << self открывает раздел тела класса, в котором каждый def является методом класса. Это позволяет не писать self., когда у класса их несколько:
class Units
class << self
def km_to_miles(km)
(km * 0.621371).round(1)
end
def miles_to_km(miles)
(miles / 0.621371).round(1)
end
end
end
puts Units.km_to_miles(10)
puts Units.miles_to_km(26.2)Вывод:
6.2
42.2Используй метод класса для работы, которая относится к типу объекта, а не к одному объекту: преобразования единиц, разбора текста в объект или ведения подсчёта всех экземпляров. Для работы, которой нужны данные одного объекта, остаётся метод экземпляра:
class Invoice
def self.tax_rate # одинаковый для каждого инвойса
0.2
end
def tax # нужна сумма этого инвойса
@amount * Invoice.tax_rate
end
endЗадание
ЛегкоЗавершите методы класса Temperature. to_fahrenheit(c) и to_celsius(f) преобразуют значение. feel(celsius) возвращает freezing для значений меньше 0, cold для значений меньше 15, mild для значений меньше 25 и hot в остальных случаях. convert(text) принимает текст, например 20 C или 68 F, и возвращает 20.0 C = 68.0 F (mild) или 68.0 F = 20.0 C (mild) с одним десятичным знаком и описанием ощущения для значения в градусах Цельсия; он использует другие методы класса.
Предоставленный код вызывает Temperature.convert(line) для каждой входной строки и выводит результат. Экземпляр Temperature не создаётся.
Ваш код должен находиться в temperature.rb. В main.rb находится предоставленный код ввода/вывода, и его нельзя редактировать.
Попробуйте сами
require_relative 'temperature'
# Предоставленный код ввода/вывода: оставьте его как есть
input = []
while (line = gets)
input << line.chomp
end
input.each { |line| puts Temperature.convert(line) }
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
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