Scope gates i Ruby: Del I

Mehdi Farsi

Follow

2 september, 2019 – 3 min read

I den här artikeln kommer vi att undersöka följande ämnen:

  • Metod scope
  • Klass scope

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à !

Lämna ett svar

Din e-postadress kommer inte publiceras.