Menu
Coddy logo textTech

Методы классов

Часть раздела Объектно-ориентированное программирование путешествия по 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 Circle

class << 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
challenge icon

Задание

Легко

Завершите методы класса 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) }
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор Ruby