Home Rhyylen
Contatto
 
 
 
Crystal Language
Capitolo 2
Variabili e costanti

All'interno di un programma le variabili, come noto, sono elementi che memorizzano un qualche valore che può eventualmente essere modificato durante l'esecuzione. Gli identificatori delle variabili che definiamo all'interno di un programma in questo linguaggio iniziano normalmente con una lettera minuscola. E' ammesso anche l'uso di _ (underscore) o __ (doppio underscore) ma questo tipo di iniziale per gli identificatori è usato all'interno del compilatore e il loro uso è sconsigliato. Per esempio è ammesso il # ma non il !  ma, per farla breve, le linee guida indicano proprio nelle lettere minuscole la modalità ideale per iniziare un "nome" che volete attribuire ad una variabile nel programma ed è questo il modo che vi suggerisco di usare sempre. Potete fare comunque le vostre prove. Non ho trovato indicazioni specifiche relative alla lunghezza massima consentita ma, in base a qualche test, c'è spazio a sufficienza per qualsiasi evenienza. Va piuttosto ricordato che Crystal è case sensitive, quindi scrivere "nome" è diverso rispetto a "noME" o "nOme". E' invece da evitarsi l'uso della lettera maiuscola come iniziale e vedremo tra breve il perchè. Comunque, ad esempio:

language
x01
ab_cd

sono identificatori accettabili. Le line guida suggeriscono di usare il separatore _ nel caso di identificatori complessi con convenzione snake_case:

x = mia_email

Un identificatore particolare è quello costituito dal solo carattere _ (underscore) che è una sorta di identificatore nullo nel senso che un valore ad esso attribuito in pratica non esiste:

_ = 3
_ = "ciao"

non sono utilizzabili in pratica e nemmeno si può usare su di esso un comando di stampa. A cosa serva una cosa di questo genere lo vedremo in altri paragrafi.

Una volta stabilito il nome della variabile è necessario inizializzarla. Non è possibile invece scrivere solo il nome senza dare un valore iniziale. Questo perchè Crystal adotta l'inferenza di tipo, come abbiamo detto nell'introduzione e pertanto senza nemmeno un valore iniziale il compilatore non sa che tipo assegnare alla variabile. A proposito di inferenza, si tratta di un meccanismo interessante al quale dedicheremo un paragrafo intero. Quindi:

language = "Crystal"
x01 = 9


è una forma corretta di dichiarazione. Come avrete capito, magari fin dal capitolo precedente, l'operatore = si occupa di legare il nome di una variabile al suo valore, è insomma l'operatore di assegnazione. Nell'esempio 2.2 del capitolo precedente abbiamo visto come l'inizializzazione possa avvenire anche attraverso una funzione che retituisce un qualche elemento (in quell'esempio infatti abbiamo inizializzato la variabile nome, col valore di ritorno di gets()). Quando parleremo delle funzioni sarà tutto più chiaro.

In forma alternativa potremmo in un certo senso "prenotare" il tipo con la notazione
:

nomevariabile : tipo

ma sempre, prima dell'uso, dovremo attribuire un valore coerente col tipo assegnato. Eventualmente si può assegnare subito un valore con una piccola aggiunta sintattica:

nomevariabile : tipo = valore

x01 : Int32 = 9

Con questa notazione il tipo sarà fissato per tutto il programma e non potrà essere cambiato come invece vediamo avvenire qui di seguito quando l'inizializzazione viene eseguita per inferenza tramite attribuzione di un valore iniziale. Infatti in questo caso se anche definendo un valore imponiamo di fatto alla variabile il tipo a cui il valore appartiene, questo non ci impedisce di attribuirne alla stessa successivamente un altro anche di un tipo diverso:

x01 = 9
x01 = "aa"

x01, dopo l'esecuzione delle due istruzioni, ha valore "aa" (senza apici, ovviamente), il compilatore non ha problemi a gestire questi cambi di tipologia, nel caso in oggetto si passa da un intero ad una stringa.
Tramite l'istruzione typeof(nomevariabile) è sempre possibile sapere il tipo corrente di una variabile.

x01 = 9
puts typeof(x01)
x01 = "aa"
puts typeof(x01)

che presenta il seguente output:

Int32
String

Da ultimo, notiamo che è possibile inizializzare le variabili in maniera compatta (inizializzazione multipla) usando la virgola come separatore, ovviamente l'inizializzazione in questi casi è rigorosamente posizionale:

x, y, z = 1, 2, 3

Inizieremo dal prossimo paragrafo a parlare dei tipi.

Come abbiamo detto all'inizio l'uso delle maiuscole all'inizio di un identificatore non va bene per le variabili . Questo perchè in realtà questa modalità di nomenclatura è riservato per le costanti, ovvero elementi a cui viene attribuito un valore iniziale che non potrà essere più modificato nel resto del programma. Ad esempio le seguenti 4 righe:

valore = 3
Valore = 4
valore = 5
Valore = 6

non compilano e questo perchè l'ultima cerca di modificare un valore che alla seconda riga è definito come costante essendo attribuita al suo identificatore la lettera iniziale maiuscola. Il messaggio di errore è chiaro:

4 | Valore = 6
^-----
Error: already initialized constant Valore

La riga incriminata è l'ultima il compilatore ci dice che Valore è già inizializzato e il suo valore non può essere modificato. Una costante deve essere inizializzata in fase di scrittura del codice, a compile time il suo valore deve essere noto. L'inizializzazione multipla non è permessa per le costanti. In realtà inoltre le linee guida raccomandano di scrivere le variabili interamente usando lettere maiuscole (come in Python), quindi ad esempio:

VALORE = 4

è una scrittura più standard.