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").walkinclude добавляет методы экземпляра
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.stampextend добавляет методы класса
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.privilegesinclude и 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 — локальная установка не требуется.