0Pricing
Ruby Academy · Lekcja

include i extend

Dodawanie zachowania przez mixiny

include i extend to bezpłatna lekcja Ruby Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Ruby Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Ruby Academy zawiera 4 lekcji w sumie.

Współdzielenie zachowania za pomocą miksinów

Prawdziwa siła modułów tkwi w miksinie: udostępnianiu metod wielu klasom bez dziedziczenia. Dwa główne narzędzia to include i 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 dodaje metody instancji

include dołącza metody modułu jako metody instancji. Każdy obiekt danej klasy je otrzymuje.

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

Ponowne użycie w wielu klasach

Jeden moduł może zostać dołączony do wielu niezwiązanych ze sobą klas, umożliwiając współdzielenie zachowania bez wspólnego rodzica.

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 dodaje metody klasowe

extend dołącza metody modułu jako metody klasowe (metody samego obiektu klasy).

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

extend na obiekcie

Można użyć extend dla pojedynczego obiektu, aby tylko on otrzymał te metody, bez modyfikowania pozostałych obiektów.

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

include a extend

Należy pamiętać o różnicy:

  • include => metody stają się metodami instancji.
  • extend => metody stają się metodami klasy/obiektu.
module Helper
  def help; "helping"; end
end
class A; include Helper; end
class B; extend Helper; end
puts A.new.help
puts B.help

Moduły widzą metody obiektu gospodarza

Metoda z dołączonego modułu działa w kontekście obiektu gospodarza, dlatego może wywoływać jego własne metody i uzyskiwać dostęp do jego danych.

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

Hak included

Zdefiniuj self.included(base), aby kod wykonywał się automatycznie po dołączeniu modułu. Klasyczny wzorzec polega na jednoczesnym dodaniu metod klasowych.

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

Sprawdzanie przynależności

is_a? i ancestors pokazują, że dołączony moduł staje się częścią łańcucha typów obiektu.

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

Łączenie wielu miksinów

Klasa może dołączać wiele modułów, tworząc zachowanie złożone z wielu małych, wyspecjalizowanych elementów.

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

Składanie wszystkiego w całość

Miksiny pozwalają elastycznie współdzielić zachowanie:

  • include służy do metod instancji.
  • extend służy do metod klasy lub pojedynczego obiektu.
  • Metody z miksinów działają w kontekście obiektu gospodarza.
  • Można łączyć wiele małych modułów.
module Greet
  def hi; "hi from #{self.class}"; end
end
class Cat; include Greet; end
puts Cat.new.hi

Szybki test

Proszę sprawdzić swoją znajomość include i extend.

Podsumowanie

Omówiono miksiny:

  • include => metody instancji.
  • extend => metody klasy lub pojedynczego obiektu.
  • Metody z miksinów działają w kontekście obiektu gospodarza.
  • Hak included jest uruchamiany podczas dołączania modułu.
module Loud
  def shout(s); s.upcase; end
end
class Speaker; include Loud; end
puts Speaker.new.shout("hello")

Często zadawane pytania

Czy lekcja „include i extend” jest bezpłatna?

Tak — pełny tekst „include i extend” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Ruby Academy, przejdź na CoddyKit PRO. Kurs Ruby Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „include i extend”?

Dodawanie zachowania przez mixiny Ćwiczysz Ruby Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Ruby Academy?

Nie wymagamy żadnego doświadczenia. Ruby Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „include i extend”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Ruby Academy?

Tak. Każda lekcja Ruby Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Definiowanie modułów
  2. include i extend
  3. Comparable i Enumerable
  4. prepend i wyszukiwanie metod
← Powrót do Ruby Academy