An yleiskatsaus lohkojen suoritusyhteyteen
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
-luokanClass
instanssiGreeting
-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à!