Scala: lavorare con i dati

Tipi

Finora abbiamo incontrato cose come “int”, “double”, “string”. Si tratta di tipi. Scala ha sia tipi numerici che non numerici, e sono essi stessi degli oggetti con metodi e operatori per manipolarli. Diversamente da linguaggi come il C, dove il concetto di tipo peraltro è abbastanza vago (un mio professore all’Università diceva che “Il C è come il sesso libero: tutto è permesso”), il concetto di tipo primitivo in Scala non c’è.

Tipi numerici

Nome Descrizione Dimensione Valore minimo Valore massimo
Byte Intero con segno 1 byte -127 128
Short Intero con segno 2 byte -32768 32767
Int Intero con segno 4 byte -231 231-1
Long Intero con segno 8 byte -263 263-1
Float Virgola mobile con segno 4 byte * *
Double Virgola mobile con segno 8 byte * *

La rappresentazione in virgola mobile è determinata dallo standard IEEE 754, e potete trovare un calcolo dei valori massimo e minimo di float e double qui.

Possiamo convertire un numero in un altro in base al concetto di rango: l’idea alla base è che un tipo più piccolo può essere convertito in uno più grande senza rischio di perdere informazioni (se converto un byte in uno short o in un int non succede niente), mentre se vado a fare la conversione inversa (da int a short, ad esempio) il rischio di perdere informazione è molto alto, quindi va fatto solo se siamo più che sicuri di quello che stiamo facendo. C’è da dire, comunque, che se proviamo a convertire un tipo di rango più alto in un tipo di rango più basso Scala ci segnala un errore, cosa che non accade quando facciamo il contrario:

Come potete notare quando ho provato ad assegnare a s (short) il valore di i (int) il compilatore mi ha insultato pesantemente, mentre quando ho usato il metodo toShort di Int (poiché ero molto sicuro di quello che stavo facendo) non ha battuto ciglio. Ovviamente non esiste solo toShort, ma più in generale ogni tipo ha un suo metodo toType per convertire il suo valore in un altro tipo.

Stringhe

Quando si tratta di stringhe anche in Scala, come in altri linguaggi, l’operatore di somma diventa un operatore di concatenazione, e questo è il modo facile. Se vogliamo un modo elegante di costruire stringhe possiamo ricorrere all’interpolazione. Niente di esotico: all’interno della mia stringa metto il nome di un valore (o di una variabile) preceduto dal dollaro e il gioco è fatto.

val batman = "Na " * 16 + "Batman!"
val tema = s"Il tema di Batman fa più o meno $batman" 

Potete immaginare da voi cosa stampa questo codice, non ve lo mostro per non rovinarvi la sorpresa. Come si può notare prima del valore di tema ho aggiunto una s: quella è la notazione di Scala per usare l’interpolazione delle stringhe. Possiamo includere il nome della variabile tra parentesi graffe, e questo torna utile quando non si riesce a distinguere il suo nome da ciò che c’è intorno:

 val scal = "Scala" val cosaStiamoFacendo = s"Stiamo imparando i segreti di ${scal}a" 

Questa non è l’unica notazione disponibile per fare l’interpolazione di stringhe: possiamo anche usare la notazione printf. Per usare questa notazione facciamo precedere la stringa dalla f, e facciamo seguire alla variabile/valore la notazione:

Tuple

Concludiamo questa carrellata di tipi con le tuple (o n-uple). Il concetto di tupla è analogo al concetto di riga nei DB relazionali: una tupla è un contenitore ordinato di due o più valori eterogenei (vale a dire di tipi diversi). Le tuple tornano utili quando si vogliono raggruppare logicamente dei dati tra loro correlati (quindi non è u ìn calderone per buttarci dentro qualunque cosa come scorciatoia, Uncle Bob vi vede), vedendoli come un’unità coerente.

Per creare una tupla sarà sufficiente scrivere i valori racchiusi tra parentesi e separati da virgola:

(<value 1>, <value 2>[,<value 3>...])

 

val info = ("Uncle Bob","is watching", "you",567)

Per accedere agli elementi della tupla si usa una sintassi un po’ orrenda, che quando si ha a che fare con tanti elementi produce un po’ di confusione: si fa seguire il nome della tupla dall’indice dell’elemento che vogliamo (a partire da 1):


val uncleBob = info._1

Un’alternativa per creare tuple formate da due valori ci viene data dall’operatore freccia (->). E’ una scorciatoia molto comune per rappresentare coppie chiave valore in Scala:


val uncleBob = "uncle" -> "Bob"

Pierpaolo Paris

Sono uno dei tanti che sono entrati nel girone infernale di Ingegneria Informatica, e che poi ne è anche uscito. Attualmente lavoro come sviluppatore presso una società di consulenza. Ogni tanto mi diletto con la fotografia.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.