Variabili Stringa in Linguaggio Lua

Nella lezione precedente abbiamo visto come definire stringhe letterali in Lua. In questa lezione, vedremo come definire variabili stringa.

Vedremo, inoltre, alcune delle operazioni di base che è possibile effettuare sulle stringhe in Lua, come la concatenazione, la lunghezza e il confronto tra stringhe.

Variabili Stringa

In Lua, per definire una variabile stringa, è sufficiente assegnare un valore di tipo stringa a una variabile. Ad esempio:

nome = "Roberto"
cognome = "Ierusalimschy"

In questo esempio, abbiamo definito due variabili nome e cognome di tipo stringa, assegnando loro i valori "Roberto" e "Ierusalimschy" rispettivamente.

Un dettaglio molto importante che contraddistingue le variabili stringa in Lua rispetto ad altri linguaggio è che le stringhe sono immutabili.

Ciò significa che, a differenza di linguaggi come il C, se modifichiamo una stringa o una sua parte, l'interprete Lua creerà una nuova stringa con il valore modificato, piuttosto che modificare la stringa originale.

Vedremo le conseguenze di questa caratteristica nel corso di questa lezione ed in seguito.

Definizione

Variabili Stringa in Lua

Le variabili stringa in Lua sono definite assegnando un valore di tipo stringa a una variabile:

s = "stringa"
Le stringhe in Lua sono immutabili, per cui ogni operazione che modifica una stringa crea una nuova stringa con il risultato dell'operazione.

Di base, il linguaggio Lua permette di effettuare tre operazioni sulle stringhe:

  • Concatenazione: unire due o più stringhe in una sola;
  • Lunghzza: ottenere la lunghezza di una stringa;
  • Confronto: confrontare due stringhe per determinare se sono uguali o meno.

Vediamo queste operazioni nel dettaglio.

Concatenazione di Stringhe

In Lua è possibile concatenare due o più stringhe adoperando l'operatore di concatenazione ... Ad esempio:

nome = "Roberto"
cognome = "Ierusalimschy"

nome_completo = nome .. " " .. cognome

print(nome_completo) -- Stampa: Roberto Ierusalimschy

In questo esempio, abbiamo concatenato tre stringhe: nome, uno spazio " " e cognome, assegnando il risultato alla variabile nome_completo.

Come abbiamo detto sopra, tutte le stringhe in Lua sono immutabili e ciò ha delle importanti conseguenze per l'operazione di concatenazione.

Ogniqualvolta l'operatore di concatenazione .. viene utilizzato, Lua crea una nuova stringa contenente il risultato della concatenazione, piuttosto che modificare le stringhe originali.

Per cui, se prendiamo l'esempio che segue:

nome = "Roberto"                -- Roberto
nome .. " " .. "Ierusalimschy"  -- Roberto Ierusalimschy
print(nome)                     -- Roberto

Vediamo che la variabile nome non è stata modificata dalla concatenazione.

Per salvare il risultato dell'operazione è necessario assegnarlo ad una nuova variabile, per cui:

s1 = "Ciao"
s2 = "Mondo"

s3 = s1 .. " " .. s2

print(s3) -- Stampa: Ciao Mondo

In questo caso, la variabile s3 contiene il risultato della concatenazione tra s1 e s2.

Definizione

Concatenazione di Stringhe in Lua

Per concatenare due o più stringhe in Lua è possibile adoperare l'operatore di concatenazione ... La sintassi è:

s = s1 .. s2

Dove s1 e s2 sono le stringhe da concatenare e s è la variabile che conterrà il risultato della concatenazione.

Il risultato della concatenazione è sempre una nuova stringa e gli operandi non vengono modificati.

Lunghezza di una Stringa

Per ottenere la lunghezza di una stringa in Lua è possibile adoperare l'operatore di lunghezza: #. Ad esempio:

s = "Hello, World!"

print(#s) -- Stampa: 13

Quindi, la sintassi per ottenere la lunghezza consiste nell'apporre davanti la stringa l'operatore #. Il risultato sarà un numero intero che rappresenta la lunghezza della stringa.

Bisogna, però, prestare attenzione quando si calcola la lunghezza di una stringa in Lua. Il risultato dell'operatore di lunghezza sarà sempre la lunghezza della stringa in byte, non in caratteri.

Fintanto che la stringa è codificata in ASCII, la lunghezza in byte e in caratteri sarà la stessa. Tuttavia, se la stringa è codificata, ad esempio, in UTF-8, la lunghezza in byte e in caratteri potrebbe non coincidere.

Per esempio, la stringa "Olá, Mundo!" è composta da 11 caratteri, ma la sua lunghezza in byte è 12, poiché la lettera á è codificata su due byte in UTF-8:

s = "Olá, Mundo!"

print(#s) -- Stampa: 12 anziché 11
Definizione

Lunghezza di una Stringa in Lua

Per ottenere la lunghezza di una stringa in Lua è possibile adoperare l'operatore di lunghezza #. La sintassi è:

n = #s

Dove s è la stringa di cui si vuole calcolare la lunghezza e n è la variabile che conterrà il risultato.

Il risultato dell'operatore di lunghezza è la lunghezza della stringa in byte, non in caratteri. Inoltre, il risultato sarà sempre un numero intero.

Confronto di Stringhe

Per confrontare due stringhe in Lua è possibile adoperare gli operatori di confronto ==, ~=, >, <, >= e <=.

Il confronto tra stringhe avviene sempre in maniera lessicografica, ovvero in base a due regole:

  1. I singoli caratteri vengono confrontati in base al loro valore ASCII;

    Per cui, ad esempio, "A" è minore di "a" ma è maggiore di "?" in base alla codifica ASCII;

  2. Se due stringhe iniziano con gli stessi caratteri, ma una è più lunga dell'altra, la stringa più lunga è considerata maggiore;

    Ad esempio, "casa" è minore di "casale" in quanto, anche se entrambe iniziano con "casa", la seconda stringa è più lunga.

Gli operatori relazionali possono essere adoperati, quindi, per confrontare stringhe e il loro risultato sarà sempre un valore booleano, true o false. Tale valore, può essere adoperato in tutti quei punti in cui è richiesto un valore booleano, come ad esempio in un'istruzione if.

s1 = "casa"
s2 = "casale"

if s1 < s2 then
    print("La stringa s1 è minore di s2")
else
    print("La stringa s1 è maggiore o uguale a s2")
end

In questo esempio, la stringa s1 è minore di s2 in quanto s1 è più corta di s2. Per cui, il programma stamperà La stringa s1 è minore di s2.

Definizione

Confronto di Stringhe in Lua

Il confronto tra due stringhe in lua avviene in maniera lessicografica, ovvero in base al valore ASCII dei singoli caratteri.

Per effettuare confronti tra stringhe è necessario adoperare gli operatori relazionali ==, ~=, >, <, >= e <=. Il risultato del confronto sarà sempre un valore booleano, true o false.

Conclusioni

In questa lezione abbiamo visto come definire variabili stringa in Lua e come effettuare operazioni di concatenazione, lunghezza e confronto tra stringhe.

Le stringhe in Lua sono immutabili, per cui ogni operazione che modifica una stringa crea una nuova stringa con il risultato dell'operazione.

Inoltre, abbiamo visto come calcolare la lunghezza di una stringa e come confrontare due stringhe in base alla loro rappresentazione lessicografica.

Nella prossima lezione, vedremo un aspetto molto importante delle stringhe in linguaggio Lua: la coercizione.