Ceylon project



Stringhe

 
anything
    Object
          String

Indica una sequenza di caratteri. Ogni carattere è rappresentato in formato 32 bit Unicode. Internamente, nascosta verso l'esterno, una stringa è codificata UTF-16. La loro rappresentazione è ottenuta racchiudendo la sequenza di caratteri all'interno di una coppia di doppi apici. Una coppia di singoli apici, ammessa in altri linguaggi come delimitatore di una stringa, invece può contenere un singolo carattere e si tratta di un tipo Character. La sequenza di caratteri componenti la stringa è indicizzata in maniera sequenziale tramite interi iniziando da 0. Il primo carattere avrà quindi indice 0, il secondo indice 1 e così via fino all'ennesimo che avrà indice n-1.

Le stringhe sono manipolabili in molti modi in questo linguaggio:

  • somma: ottenibile attraverso l'operatore +
    String s1 = "aaa";
    String s2 = "bbb";
    print (s1 + s2);

  • estrazione di un singolo carattere: si usa il consueto operatore []
    String s1 = "aaa";
    String s2 = "cde";
    value c1 = "aaa"[1];
    value c2 = s2[2];

  • è possibile estrarne dei range: l'operatore è [indice di partenza .. indice finale]
    String s1 = "abcde";
    String s2 = "abcde"[1..3];

  • sono iterabili maniera efficiente
    void hello()
    {
      String s1 = "abcde";
      variable Integer x = 0;
      for (char in s1)
      {
        print(x);
        x = x + 1;
      }
    }

  • E' possibile usare la comprehension per trasformarle esempio (tratto dal sito ufficiale):
    String { for (s in "hello world") if (s.letter) s.uppercased }

Nota-1 se ricorriamo al + per concatenare le stringhe dobbiamo anche ricordarci di richiamare esplicitamente il metodo string per convertire i numeri in stringhe. Diversamente otterremmo un errore perchè questo procedimento non viene svolto automaticamente, per cui:

print("sette = " + 7);          // errore!
print("sette = " + 7.string);   // ok!

Nota-2: dovendo estrarre un carattere è preferibile usare la notazione stringa[indice..indice], dove la notazione "indice" identifica lo stesso numero (es: stringa[1..1]). In questo caso infatti viene estratta una stringa contenente un solo carattere mentre l'istruzione stringa[indice] (es: stringa[1]) estrae un carattere, meno facilmente manipolabile.

All'interno delle stringhe si possono usare le classiche sequenze di escape per inserire caratteri particolari; la cosa non differisce da quanto incontrato in altri linguaggi:

Sequenza Descrizione
\t Inserisce una tabulazione
\b Indietro di una posizione
\n Inserisce una nuova riga
\r Ritorno del carrello
\f Inserisce un formfeed
\' Inserisce un apice
\" Inserisce un doppio apice
\\ Inserisce un backslash

Ad esempio:

String s2 = "abc\nde";
print(s2);

stampa:

abc
de

E' possibile, tramite il backslash, inserire anche sequenze di 2 o 4 byte per inserire caratteri Unicode:

\{#03C0},

A questo proposito va sottolineato come Ceylon ammetta anche le verbatim string che permettono di risparmiare un po' di sforzo, inteso come inserimento di alcuni dei caratteri di escape; le stringhe verbatim sono introdotte e chiuse da una tripletta di doppia apici:

"""Questa e' una stringa verbatim che contiene al suo interno un singolo apice"""
""""Ciao", questa contiene due doppi apici"""

All'interno di una stringa è possibile anche interpolare delle variabili; questa operazione avviene inserendo l'identificativo della stessa all'interno di una doppia coppia di "backtick" (codice ascii 96), come nell'esempio seguente:

  Esempio 1
1
2
3
4
5
void hello()
{
Integer x = 7;
print("x ha valore: ``x`` (sette)");
}

Come indica chiaramente la discendenza indicata a inizio pagina, le stringhe sono oggetti ed hanno quindi un bel corredo di attributi e metodi, tra quelli propri e quelli ereditati. Sono veramente molti e noi qui di seguito indichiamo alcuni dei più importanti:

ATTRIBUTI

  nome cosa restituisce?
  characters I caratteri che individuano la stringa
  coalesced restituisce la stringa stessa
  empty Restituisce true se la stringa è vuota, false altrimenti. E' più efficiente rispetto al confronto size = 0;
hash il valore hash per la stringa
lastindex L'indice più alto presente nella stringa. Equivale al numero di elementi componenti la stringa stessa meno 1
lines spezza la stringa in linee di testo
lowercased restituisce la tringa con tutti i caratteri minuscoli -
normalized restituisce la stringa originaria compattando gli spazi se in numero maggiore di 1 ed eliminando quelli all'inizio e queli alla fine della stringa stessa.
reversed restituisce la stringa rovesciata
size è la dimensione, ovvero il numero di elementi, della stringa
string restituisce la stringa stessa
trimmed restuisce la stringa privata degli spazi iniziali e finali, se presenti
uppercased restituisce la stringa con tutti i caratteri maiuscoli

METODI

  nome descrizione
compare Compara due stringhe secondo la looro codifica UTF restituendo i valori larger, smaller ed equal. Ad esempio:
print("aaa".compare("ab")); // restituisce smaller
print("aaa".compare("aa")); // restituisce larger
contains restituisce true o false a seconda del fatto che la stringa contenga o no l'elemento indicato
equals verifica se un dato oggetto è una stringa e, in quel caso se ha la stessa lunghezza e gli stessi caratteri nello stesso ordine di un'altra.
get(indice) restituisce il carattere all'indice specificato o null se siamo andati oltre
terminal restituisce una stringa formata da un dato numero di caratteri finali
firstOccurrence(String sottostringa) Restituisce la prima occorrenza di una data sottostringa, il primo indice, oppure null se non esiste
initial(Natural length) Restituisce una sottostringa costituita dai caratteri a partire dal primo elemento per la lunghezza indicata da length
item(Natural indice) restituisce il carattere che si trova ad una data posizione o null se l'indice è oltre il limite della stringa