Photo by Jack Anstey on Unsplash

An yleiskatsaus lohkojen suoritusyhteyteen

Mehdi Farsi

Seuraa

Sep 20, 2019 – 3 min read

Tämässä artikkelissa tutustumme seuraaviin aiheisiin:

  • scopes ja lohkot
  • flat scope guard in class/module

Aluksi voit vapaasti selata Scope Gates in Ruby: Part II -artikkeli.

Etukäteen

Olen innoissani voidessani jakaa kanssasi uusimman projektimme: Fun Facts about Ruby – Volume 1

Kannattaa levittää sanaa ja jakaa tätä linkkiä! 🙏

Kiitos ajastasi!

Rubyssa lohko voi käyttää ulkoista laajuutta

Tässä esimerkissä voimme käyttää outer_scope_variable-muuttujaa lohkon sisällä. Lohkomme saa pääsyn tähän muuttujaan, vaikka muuttuja on ilmoitettu main-tason scopeissa. Tässä tapauksessa sanomme, että lohko flatten scope. Siksi kutsumme tätä mekanismia yleisesti: Flat Scope.

Toisaalta lohko luo eristetyn scope:n – vaikka self:n arvo lohkon sisällä pysyykin main-objektina.

Siten emme pääse käsiksi lohkon sisällä määriteltyihin paikallisiin muuttujiin

Tässä emme pääse käsiksi block_variable:een ulommasta scope:sta. Nyt kun olemme paremmin perehtyneet tasaisen laajuuden käsitteeseen Rubyssä, katsotaanpa, vaikuttaako tämä käsite luokkien määrittelyyn.

Luokka, moduuli ja lohko

Rubyssä se, mitä yleisesti kutsutaan luokaksi, on taustalla Class-luokan instanssi

Tässä luomme Hello– ja Greeting-luokat kahdella eri tavalla:

  • käyttämällä class-avainsanaa
  • osoittamalla Class-luokan Class instanssi Greeting-vakiolle

Huomaa, että välitämme lohkon Class.new-metodille. Tämä lohko tulkitaan luokan sisällöksi. Normaalisti luokka ei voi käyttää muuttujia, jotka on määritelty ulommassa laajuudessa – koska class-avainsana muuttaa self:n arvoa ja luo eristetyn laajuuden.

Koska käytämme lohkoa luodaksemme Greeting-luokan, meidän pitäisi pystyä käyttämään flat scope -mekanismia. Todellako?

Tässä näemme, että self:n arvo muuttuu, kun käytämme class:aa tai Class.new:aa.

Lisäksi lohkomme Class#message on edelleen eristetty main-oliosta def-avainsanan käytön vuoksi. Todellakin, koska lohkomme suoritetaan metodin kontekstissa, lohko tasoittaa laajuuden tämän tietyn objektin sisällä – eikä korkeammalla laajuudella kuin main-objekti.

Sentähden meillä ei ole pääsyä outer_variable:een message:n sisällä.

Mutta jos käytämme define_method määritelläksemme message, niin scope litistyy

Tässä, koska define_method(:message) ottaa argumenttina lohkon, tämän lohkon scope litistyy ja tämä metodi pääsee käsiksi outer_variable:een.

Voilà!

Articles

Vastaa

Sähköpostiosoitettasi ei julkaista.