Ruby Academy · Lektion

include og extend

Bland adfærd ind

Lektion 2 af 413 trin

include og extend er en gratis Ruby Academy-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Ruby Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Ruby Academy-kurset indeholder 4 lektioner i alt.

Blande adfærd ind

Modulernes egentlige styrke er et mixin: at dele metoder på tværs af klasser uden nedarvning. De to vigtigste værktøjer er include og 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 tilføjer instansmetoder

include blander et moduls metoder ind som instansmetoder. Alle objekter i klassen får dem.

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

Genbrug på tværs af klasser

Et modul kan inkluderes af mange indbyrdes uafhængige klasser, så de deler adfærd uden en fælles overklasse.

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 tilføjer klassemetoder

extend blander et moduls metoder ind som klassemetoder (metoder på selve klasseobjektet).

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

extend på et Object

Du kan bruge extend på et enkelt objekt, så kun det får metoderne, mens de andre forbliver uændrede.

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

include kontra extend

Husk forskellen:

  • include => metoder bliver til instansmetoder.
  • extend => metoder bliver til klassemetoder eller metoder på enkeltobjekter.
module Helper
  def help; "helping"; end
end
class A; include Helper; end
class B; extend Helper; end
puts A.new.help
puts B.help

Moduler kan se værtsmetoder

En metode fra et mixin kører i værtsobjektets kontekst, så den kan kalde værtsobjektets egne metoder og tilgå dets data.

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

Hooket included

Definér self.included(base) for automatisk at køre kode, når et modul inkluderes. Et klassisk mønster tilføjer klassemetoder samtidig.

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

Kontrollere medlemskab

is_a? og ancestors viser, at et inkluderet modul bliver en del af objektets typekæde.

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

Kombinere flere mixins

En klasse kan inkludere flere moduler og sammensætte adfærd fra mange små, fokuserede dele.

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

Sæt det hele sammen

Mixins deler adfærd fleksibelt:

  • include til instansmetoder.
  • extend til metoder på klasser eller enkeltobjekter.
  • Metoder fra mixins kører i værtsobjektets kontekst.
  • Sammensæt mange små moduler.
module Greet
  def hi; "hi from #{self.class}"; end
end
class Cat; include Greet; end
puts Cat.new.hi

Hurtigt tjek

Afprøv din forståelse af include og extend.

Opsamling

Du har lært om mixins:

  • include => instansmetoder.
  • extend => metoder på klasser eller enkeltobjekter.
  • Metoder fra mixins kører i værtsobjektets kontekst.
  • Hooket included udløses ved inkludering.
module Loud
  def shout(s); s.upcase; end
end
class Speaker; include Loud; end
puts Speaker.new.shout("hello")
Gratis at komme i gang

Lær Ruby med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
29
Lektioner
109

Ofte stillede spørgsmål

Er lektionen “include og extend” gratis?

Ja — alle 3 lektioner i læringssporet Ruby Academy, inklusive “include og extend”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Ruby Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “include og extend”?

Bland adfærd ind Du øver dig i Ruby Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Ruby Academy?

Der kræves ingen tidligere erfaring. Ruby Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.

Hvor lang tid tager lektionen “include og extend”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Ruby Academy-lektion?

Ja. Alle Ruby Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Definition af moduler
  2. include og extend
  3. Comparable og Enumerable
  4. prepend og method resolution
← Tilbage til Ruby Academy