Ruby Academy · Lektion

prepend och metodupplösning

Kedjor av förfäder.

Lektion 4 av 413 steg

prepend och metodupplösning är en gratis lektion i Ruby Academy på CoddyKit. Detta är lektion 4 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Ruby Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Ruby Academy innehåller totalt 4 lektioner.

Förfäderskedjor

När ni anropar en metod söker Ruby igenom en lista som kallas förfäderskedjan. Den första matchande definitionen används. Genom att förstå den här kedjan blir det tydligt hur mixins och arv samverkar.

class Animal; end
class Dog < Animal; end
p Dog.ancestors

Ordning för metodsökning

Ruby söker först i objektets klass, sedan i dess inkluderade moduler, därefter i dess superklass och så vidare upp genom kedjan tills metoden hittas.

module M
  def hello; "from module"; end
end
class C
  include M
  def hello; "from class"; end
end
puts C.new.hello

include placeras under klassen

En include-modul hamnar precis under klassen i kedjan. Klassens egna metoder har företräde framför modulens.

module M; end
class C
  include M
end
p C.ancestors  # [C, M, Object, ...]

Möt prepend

prepend infogar en modul ovanför klassen i kedjan. Då hittas modulens metoder först, före klassens egna metoder.

module M
  def hello; "from module"; end
end
class C
  prepend M
  def hello; "from class"; end
end
puts C.new.hello

prepend i kedjan

Inspektera förfädrarna för att se hur prepend placerar modulen före klassen.

module M; end
class C
  prepend M
end
p C.ancestors  # [M, C, Object, ...]

super från en prependad modul

Eftersom den prependade modulen körs först kan den omsluta klassmetoden genom att anropa super för att nå originalet. Det passar perfekt för att dekorera beteenden.

module Logged
  def save
    puts "before save"
    result = super
    puts "after save"
    result
  end
end
class Record
  prepend Logged
  def save
    puts "saving record"
    :ok
  end
end
p Record.new.save

super i mixins

super följer förfäderskedjan. Från en inkluderad modul når super superklassen, och från en prependad modul når det själva klassen.

module Polite
  def greet; "Hi! " + super; end
end
class Person
  prepend Polite
  def greet; "I am here."; end
end
puts Person.new.greet

Omslutning utan redigering

prepend gör det möjligt att lägga till beteende runt befintliga metoder utan att ändra den ursprungliga klasskoden, som ett rent alternativ till monkey patching.

module Timing
  def compute(n)
    puts "start"
    super
  end
end
class Calc
  prepend Timing
  def compute(n); n * n; end
end
puts Calc.new.compute(5)

Ordning för flera moduler

När flera moduler inkluderas hamnar den senast inkluderade närmast klassen och söks först.

module A; def who; "A"; end; end
module B; def who; "B"; end; end
class C
  include A
  include B
end
puts C.new.who  # B wins (included last)
p C.ancestors

Sammanfattning: include jämfört med prepend

Jämförelse sida vid sida:

  • include M: kedjan är [Class, M, ...] — klassens metoder har företräde.
  • prepend M: kedjan är [M, Class, ...] — modulens metoder har företräde och kan använda super för att gå in i klassen.
module M; end
class Inc; include M; end
class Pre; prepend M; end
p Inc.ancestors
p Pre.ancestors

Så hänger det ihop

Metodupplösning följer förfäderskedjan:

  • Klassens metoder går före inkluderade moduler.
  • Prependade moduler går före klassen.
  • super går ett steg uppåt i kedjan.
module Cap
  def name; super.capitalize; end
end
class User
  prepend Cap
  def name; "ada"; end
end
puts User.new.name

Snabbtest

Testa era kunskaper om metodupplösning.

Sammanfattning

Ni har lärt er om metodupplösning:

  • Ruby söker igenom förfäderskedjan uppifrån och ned.
  • include placeras under klassen och prepend ovanför den.
  • super når nästa definition uppåt i kedjan.
  • prepend omsluter metoder på ett rent sätt.
module Loud
  def speak; super.upcase; end
end
class Bot
  prepend Loud
  def speak; "beep"; end
end
puts Bot.new.speak
Gratis att börja

Lär dig Ruby med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
29
Lektioner
109

Vanliga frågor

Är lektionen ”prepend och metodupplösning” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Ruby Academy, inklusive ”prepend och metodupplösning”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Ruby Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”prepend och metodupplösning”?

Kedjor av förfäder. Ni övar på Ruby Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Ruby Academy?

Du behöver inga förkunskaper. Utbildningen i Ruby Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.

Hur lång tid tar lektionen ”prepend och metodupplösning”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Ruby Academy-lektionen?

Ja. Varje Ruby Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Definiera moduler
  2. include och extend
  3. Comparable och Enumerable
  4. prepend och metodupplösning
← Tillbaka till Ruby Academy