0Pricing
Ruby Academy · Урок

include и extend

Добавляйте поведение через примеси

«include и extend» — бесплатный урок Ruby Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Ruby Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Ruby Academy содержит 4 уроков всего.

Добавление общего поведения

Главная сила модулей — это миксин: возможность делиться методами между классами без наследования. Два основных инструмента — include и extend.

module Walkable
  def walk
    "#{name} is walking"
  end
end
class Person
  include Walkable
  attr_reader :name
  def initialize(name)
    @name = name
  end
end
puts Person.new("Ada").walk

include добавляет методы экземпляра

include подключает методы модуля как методы экземпляра. Они становятся доступны каждому объекту класса.

module Sayable
  def say(msg)
    "#{msg}!"
  end
end
class Dog
  include Sayable
end
puts Dog.new.say("Woof")

Повторное использование в разных классах

Один модуль можно подключить к множеству не связанных между собой классов, предоставляя им общее поведение без общего родителя.

module Timestamped
  def stamp
    "created"
  end
end
class Post; include Timestamped; end
class Comment; include Timestamped; end
puts Post.new.stamp
puts Comment.new.stamp

extend добавляет методы класса

extend подключает методы модуля как методы класса — методы самого объекта-класса.

module Findable
  def find(id)
    "Finding record #{id}"
  end
end
class User
  extend Findable
end
puts User.find(42)

extend для объекта

Можно применить extend к одному объекту, чтобы методы появились только у него, а остальные объекты не изменились.

module Admin
  def privileges
    "all access"
  end
end
user = Object.new
user.extend(Admin)
puts user.privileges

include и extend

Запомните различие:

  • include => методы становятся методами экземпляра.
  • extend => методы становятся методами класса или объекта.
module Helper
  def help; "helping"; end
end
class A; include Helper; end
class B; extend Helper; end
puts A.new.help
puts B.help

Модули видят методы объекта-хоста

Метод подключённого модуля выполняется в контексте объекта-хоста, поэтому он может вызывать собственные методы хоста и обращаться к его данным.

module Describable
  def describe
    "I am #{role}"
  end
end
class Worker
  include Describable
  def role; "a worker"; end
end
puts Worker.new.describe

Хук included

Определите self.included(base), чтобы автоматически выполнять код при подключении модуля. Классический приём — одновременно добавлять методы класса.

module Trackable
  def self.included(base)
    puts "Trackable added to #{base}"
  end
end
class Order
  include Trackable
end

Проверка принадлежности

is_a? и ancestors показывают, что подключённый модуль становится частью цепочки типов объекта.

module Flyable; end
class Bird; include Flyable; end
b = Bird.new
puts b.is_a?(Flyable)
p Bird.ancestors

Объединение нескольких миксинов

Класс может подключать несколько модулей, объединяя поведение множества небольших специализированных компонентов.

module Swimmable; def swim; "swimming"; end; end
module Runnable; def run; "running"; end; end
class Athlete
  include Swimmable
  include Runnable
end
a = Athlete.new
puts a.swim
puts a.run

Собираем всё вместе

Миксины позволяют гибко делиться поведением:

  • include — для методов экземпляра.
  • extend — для методов класса или отдельного объекта.
  • Подключённые методы выполняются в контексте объекта-хоста.
  • Объединяйте множество небольших модулей.
module Greet
  def hi; "hi from #{self.class}"; end
end
class Cat; include Greet; end
puts Cat.new.hi

Быстрая проверка

Проверьте, насколько хорошо Вы поняли include и extend.

Повторение

Вы узнали о миксинах:

  • include => методы экземпляра.
  • extend => методы класса или отдельного объекта.
  • Подключённые методы выполняются в контексте объекта-хоста.
  • Хук included срабатывает при подключении.
module Loud
  def shout(s); s.upcase; end
end
class Speaker; include Loud; end
puts Speaker.new.shout("hello")

Часто задаваемые вопросы

Урок «include и extend» бесплатный?

Да — полный текст урока «include и extend» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Ruby Academy, подпишись на CoddyKit PRO. Курс Ruby Academy содержит 4 уроков всего.

Чему я научусь в уроке «include и extend»?

Добавляйте поведение через примеси Ты практикуешь Ruby Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Ruby Academy?

Предыдущий опыт не требуется. Ruby Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «include и extend»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Ruby Academy?

Да. Каждый урок Ruby Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Определение модулей
  2. include и extend
  3. Comparable и Enumerable
  4. prepend и разрешение методов
← Назад к Ruby Academy