Contents

Spheres of visibility, like rooms in a house

Quando abbiamo parlato di variabili abbiamo detto che il tipo più comune di variabili è la “local variable”, senza spiegare ulteriormente perché sono locali. Locale a cosa? Dove? Siamo finalmente pronti a spiegarlo di più.

Poiché ora abbiamo parlato di metodi, possiamo anche discutere di un altro importante concetto: gli ambiti.

Wikipedia dice: “Nella programmazione, l’ambito di un nome è la parte di un programmadove il nome è valido: dove il nome può essere usato per riferirsi a somethingelse.”(leggermente modificato per corrispondere alla nostra terminologia)

I nomi sono noti (o definiti) in un determinato ambito e sconosciuti (o indefiniti)al di fuori di questo ambito.

Puoi pensare a un ambito come a una sfera, una bolla o una stanza (con nowindows e porte chiuse): Alcuni nomi, come i nomi delle variabili, sono “noti” e”visibili” all’interno della stanza. Altri nomi, conosciuti e visibili in un’altra stanza sononon conosciuto in questa stanza, ma solo nell’altra stanza.

Ogni volta che c’è una chiamata al metodo e il flusso di esecuzione entra nel corpo di themethod, entra in un nuovo ambito o “stanza”. Le cose che sono” locali ” nell’ambito di questo metodo (cioè le cose che sono “all’interno” della stanza), sono solo visibili in questo ambito. Al di fuori di esso, sono sconosciuti.

Variabile locale indefinita o metodo

Questa è anche una buona opportunità per parlare di un messaggio di errore che tupotrebbe vedere più spesso. Ad esempio, lo vedrai ogni volta che hai fatto un errore di battitura e hai scritto male un nome di variabile o metodo.

Considera questo codice:

def add_two(number) number + 2endputs add_two(3)puts number

La rigaputs add_two(2)emetterà5, ma la rigaputs number genererà quindi un errore.

Questo perché la variabile number a cui viene assegnato il numero 3 quando chiamiamo il metodo è una variabile locale. È locale all’ambito del metodo. Viene creato quando il flusso di esecuzione entra nel metodo.

Al di fuori di questo ambito, quando il flusso di esecuzione è tornato dal metodol’ambito del metodo è stato distrutto e tutte le variabili locali sono scomparse. La variabile locale numbernon è quindi nota e Ruby genera un errore dicendoundefined local variable or method 'number'.

Se pensi a questo messaggio di errore per un po’, ha senso per te?

Abbiamo silenziosamente saltato il fatto che, in Ruby, sia i nomi variablenames locali che i nomi dei metodi, sono scritti allo stesso modo: sono solo parole semplici.Ad esempio, qui:

number = 2puts number

number è una variabile locale e viene utilizzata nella riga puts number.

Tuttavia, qui:

def number 2endputs number

number è il nome di un metodo. E può essere usato (chiamato) nello stesso modo esatto: puts number

Questo perché Ruby, quando esegue un programma, valuta una dichiarazione dopoun altro. E quando incontra una parola semplice come number, prima controllerà se, nell’ambito corrente, conosce una variabile locale con lo stesso nome. In tal caso, utilizzerà il valore associato a questa variabile. Se non esiste una variabile locale con questo nome, allora cercherà un metodo. Ifthere anche nessun metodo con questo nome sarà quindi sollevare il messaggio di erroreundefined local variable or method 'number'.

Quindi il messaggio di errore è abbastanza preciso, ma suona anche un po ‘ contorto. Ciò che fondamentalmente cerca di dire è:

Hai usato la parola “numero” qui, e non lo conosco (in questo ambito). Intendevi usare una variabile locale? O un metodo?

Ha senso?

Torna al tema degli ambiti locali. Diamo un’occhiata ad un altro esempio:

number = 1def add_to(number) number + 2endputs add_to(3)

Quale pensi che sarà l’output? Sarà 3, o 5? Qualcos’altro?

Se esegui il codice vedrai che è 5.

Il motivo è che noi assegnare il numero 1 in ambito esterno a avariable number, ma questa variabile è quindi mai usato: l’unica altra linea nell’ambito esterno è l’ultima riga puts add_to(3) e questa linea non usethe variabile number.

Invece, quando il flusso di controllo entra nel metodoadd_toRuby creerà un nuovo ambito locale, e definirà una nuova variabile localenumberche isassigned il numero3 che è stato passato al metodo. Questa nuova variabile number è locale all’ambito del metodo, e quindi questa è una variabile diversa da quella sulla prima riga, nell’ambito esterno.

Abbiamo trovato la seguente una buona metafora per gli ambiti:

Quando Ruby entra in un metodo, è come se entrasse in una nuova stanza lucida in ahouse. Con lei, porta gli oggetti che vengono passati come argomenti alla chiamata del metodo. Nell’esempio sopra porta un oggetto che è il numero 3.

Ora, non appena Ruby entra nel metodo, attacca le note post-it su theobjects, secondo l’elenco degli argomenti dalla definizione del metodo. Nel nostro esempio è il nome number. Quindi d’ora in poi, in questa stanza, c’è una nota variabile locale che ha un valore assegnato: L’oggetto (numero) 3 con la nota post-it number su di esso.

Nel nostro esempio, l’ambito esterno e l’ambito del metodo add_two, sonodue stanze diverse, e ci sono due diverse note post-it bloccate su due numeri diversi, che hanno lo stesso nome su di essi.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.