prepend och metodupplösning
Kedjor av förfäder.
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.ancestorsOrdning 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.helloinclude 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.helloprepend 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.savesuper 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.greetOmslutning 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.ancestorsSammanfattning: 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ändasuperför att gå in i klassen.
module M; end
class Inc; include M; end
class Pre; prepend M; end
p Inc.ancestors
p Pre.ancestorsSå 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.
supergå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.nameSnabbtest
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.
includeplaceras under klassen ochprependovanför den.supernår nästa definition uppåt i kedjan.prependomsluter 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.speakLä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
- Definiera moduler
- include och extend
- Comparable och Enumerable
- prepend och metodupplösning