2 september, 2019 – 3 min read
I den här artikeln kommer vi att undersöka följande ämnen:
För att börja
Jag är glad att kunna dela med mig av vårt senaste projekt: Fun Facts about Ruby – Volume 1
Du får gärna sprida ordet och dela det här inlägget! 🙏
Tack för din tid!
I Ruby är omfattningen av ett program starkt korrelerad med värdet på self
.
Här kommer vi att gå in i detalj på vad som är värdena på self
när vi befinner oss i en metod, en klass och i top-level scope.
Metod scope
I Ruby är top-level scope kontexten för main
-objektet.
Inde fact hänvisar self
till main
-objektet för tillfället.
Läs gärna artikeln om Rubys objektmodell om du inte är bekant main
-objektet.
Nu, vad är kontexten för self
inom en metod som är definierad i toppnivåomfånget?
Här kan vi se att self
också hänvisar till main
-objektet.
Den enda skillnaden är att vi inte har tillgång till lokala variabler som deklarerats i toppnivåomfånget inom vår metod.
Detta beror på att nyckelordet def
bäddar in metodens innehåll i ett helt isolerat scope.
Däremot kan vår metod få tillgång till instansvariabler som deklarerats i top-level scope.
Då instansvariabler deklareras på objektsnivå kan vi få tillgång till dessa variabler i ett annat scope där self
hänvisar till samma objekt – main
-objektet i vårt fall.
Så, eftersom self
pekar på main
antingen i scope på högsta nivå eller i den metod som definieras i scope på högsta nivå kan vi få tillgång till @instance_variable
-instansvariabeln i hello
-metoden.
Class scope
När vi använder nyckelordet class
:
Värdet på self
ändras
Klassens innehåll är inbäddat i ett isolerat scope
Låt oss ta en titt på följande exempel
Här kan vi se att i vår klass har self
ett annat värde – det hänvisar till Hello
-klassen.
Och vi har inte heller tillgång till variabler och metoder som är definierade utanför klassen.
Notera att vi har tillgång till instansvariabler i instansmetoder av samma skäl som beskrivs i artikelns första avsnitt.
I del II & III kommer vi att leka med scope genom att använda moduler, nästlade klasser och block (FLAT SCOPES).
Voilà !