Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

ООП в Ruby Основы Ruby

Напишем свой класс

class Bus
  def initialize(params)
    # переменная с @ - переменная класса
    @color = params[:color]
    @doors_number = 4
    @type = 'Bus'
    @wheels_number = 4
    @wheels_radius = params[:wheels_radius]
  end

  def print_string
    print "
      Vehicle: #{@type.upcase}\n
      Color: #{@color.upcase}\n
      Doors: #{@doors_number}\n
      Wheels number: #{@wheels_number}\n
      Wheels radius: #{@wheels_radius}\n
    "
  end
end

Bus.new(color: 'red', wheels_radius: 18)

Доступ к атрибутам экземпляра класса

bus = Bus.new(color: 'red', wheels_radius: 18)
# bus.color  undefined method `color'
bus.color = 'green'

class Bus
  def initialize(params)
    @color = params[:color]
    @doors_number = 4
    @type = 'Bus'
    @wheels_number = 4
    @wheels_radius = params[:wheels_radius]
  end

  def color
    @color
  end

  def color=(color)
    @color = color
  end

  def print_string
    print "
      Vehicle: #{@type.upcase}\n
      Color: #{@color.upcase}\n
      Doors: #{@doors_number}\n
      Wheels number: #{@wheels_number}\n
      Wheels radius: #{@wheels_radius}\n
    "
  end
end

class Bus
  # Создание методов-геттеров
  attr_reader :color, :doors_number, :type, :wheels_number, :wheels_radius
  # Создание методов-сеттеров
  attr_writer :color, :doors_number, :type, :wheels_number, :wheels_radius

  def initialize(params)
    @color = params[:color]
    @doors_number = 4
    @type = 'Bus'
    @wheels_number = 4
    @wheels_radius = params[:wheels_radius]
  end

  def print_string
    print "
      Vehicle: #{type.upcase}\n
      Color: #{color.upcase}\n
      Doors: #{doors_number}\n
      Wheels number: #{wheels_number}\n
      Wheels radius: #{wheels_radius}\n
    "
  end
end

bus = Bus.new(color: 'red', wheels_radius: 18)
bus.color
bus.color = 'green'

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

class Bus
  def self.bus?
    true
  end
end

Bus.bus? # true

Разграничение доступа к методам

class Bus
  # Геттеры и сеттеры
  attr_accessor :color, :doors_number, :type, :wheels_number, :wheels_radius

  def initialize(params)
    @color = params[:color]
    @doors_number = 4
    @type = 'Bus'
    @wheels_number = 4
    @wheels_radius = params[:wheels_radius]
  end

  def print_string
    print bus_string_of(self)
  end

  def bus_string_of(bus)
    bus.bus_string
  end

  protected

  def bus_string
    "
      Vehicle: #{upcase_attribute(type)}\n
      Color: #{upcase_attribute(color)}\n
      Doors: #{upcase_attribute(doors_number)}\n
      Wheels number: #{upcase_attribute(wheels_number)}\n
      Wheels radius: #{upcase_attribute(wheels_radius)}\n
    "
  end

  private

  def upcase_attribute(attribute)
    attribute.to_s.upcase
  end
end

bus = Bus.new(color: 'red', wheels_radius: 18)
bus.print_string
bus.bus_string(bus)
bus.bus_string_of(bus)

Алиасы

class Bus
  attr_accessor :color

  def initialize(params)
    @color = params[:color]
    @doors_number = 4
    @type = 'Bus'
    @wheels_number = 4
    @wheels_radius = params[:wheels_radius]
  end

  def print_string
    print bus_string_of(self)
  end
  alias to_s print_string

  def bus_string_of(bus)
    bus.bus_string
  end

  protected

  def bus_string
    "
      Vehicle: #{upcase_attribute(@type)}\n
      Color: #{upcase_attribute(@color)}\n
      Doors: #{upcase_attribute(@doors_number)}\n
      Wheels number: #{upcase_attribute(@wheels_number)}\n
      Wheels radius: #{upcase_attribute(@wheels_radius)}\n
    "
  end

  private

  def upcase_attribute(attribute)
    attribute.to_s.upcase
  end
end

bus = Bus.new(color: 'red', wheels_radius: 18)
bus.to_s
bus.to_string

Наследование

class Bus
  attr_accessor :color

  def initialize(params)
    @color = params[:color]
    @doors_number = 4
    @type = 'Bus'
    @wheels_number = 4
    @wheels_radius = params[:wheels_radius]
  end

  def print_string
    print bus_string_of(self)
  end

  def bus_string_of(bus)
    bus.bus_string
  end

  protected

  def bus_string
    "
      Vehicle: #{upcase_attribute(@type)}\n
      Color: #{upcase_attribute(@color)}\n
      Doors: #{upcase_attribute(@doors_number)}\n
      Wheels number: #{upcase_attribute(@wheels_number)}\n
      Wheels radius: #{upcase_attribute(@wheels_radius)}\n
    "
  end

  private

  def upcase_attribute(attribute)
    attribute.to_s.upcase
  end

  alias to_s print_string
end

class OfficeBus < Bus
  attr_reader :people_place

  def initialize(params)
    super
    @people_place = params[:people_place]
  end

  def has_people_place?
    people_place
  end

  protected

  def bus_string
    "
      Vehicle: #{upcase_attribute(@type)}\n
      People place: #{@people_place ? 'YES' : 'NO'}
      Color: #{upcase_attribute(@color)}\n
      Doors: #{upcase_attribute(@doors_number)}\n
      Wheels number: #{upcase_attribute(@wheels_number)}\n
      Wheels radius: #{upcase_attribute(@wheels_radius)}\n
    "
  end
end

class Bus
end

class OfficeBus < Bus
end

OfficeBus.new(color: 'red', wheels_radius: '18', people_place: true).to_s

Модули

# include

module Colorful
  COLORS = {
    black: '#000000',
    red: '#FF0000',
    white: '#FFFFFF',
  }

  def color_code(color)
    COLORS[color.to_sym]
  end
end

class Car
  def car?
    true
  end
end

class User
  # include расширяет экземпляры класса
  # Модуль используется как mixin
  # Перезаписывает методы класса, если есть с таким же именем
  include Colorful
  #...
end

class Bus
  attr_accessor :color

  include Colorful

  def initialize(params)
    @color = params[:color]
    @doors_number = 4
    @type = 'Bus'
    @wheels_number = 4
    @wheels_radius = params[:wheels_radius]
  end

  def print_string
    print bus_string_of(self)
  end

  def bus_string_of(bus)
    bus.bus_string
  end

  protected

  def bus_string
    "
      Vehicle: #{upcase_attribute(@type)}\n
      Color: #{upcase_attribute(@color)}\n
      Doors: #{upcase_attribute(@doors_number)}\n
      Wheels number: #{upcase_attribute(@wheels_number)}\n
      Wheels radius: #{upcase_attribute(@wheels_radius)}\n
    "
  end

  private

  def upcase_attribute(attribute)
    attribute.to_s.upcase
  end

  alias to_s print_string
end

bus = Bus.new(color: 'red', wheels_radius: '18')
bus.color_code(bus.color)

## extend ##

module Colorful
  def colorized?
    true
  end
end

class Bus
  # extend расширяет класс
  extend Colorful

  #...
end

Bus.colorized?

Вызовы классов и модулей

# Короткая запись - Books::HarryPotter.glasses
module HarryPotter
  def self.magic
    pp 'magic'
  end
end

module Books
  module HarryPotter
    def self.glasses
      pp 'glasses'
    end
  end

  # Вызов метода из модуля Books::HarryPotter
  HarryPotter::glasses
  # Вызов метода из модуля HarryPotter (который находится глобально)
  ::HarryPotter::magic
end

# => "glasses"
# => "magic"

method_missing

def method_missing(m, *args, &block)
  #...
end

# Стараемся использовать отдельный файл для каждого класса
# Один модуль - один файл

# ruby run.rb

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
Создание веб-приложений со скоростью света
5 месяцев
c опытом
Старт 21 ноября

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»