Verse utilizza string
come tipo per memorizzare e gestire il testo, come ad esempio "Ciao Verse"
e "Epic Games"
. In Verse, una stringa può contenere lettere, numeri, punteggiatura, spazi ed emoji. Una stringa che non contiene caratteri ""
è chiamata stringa vuota.
È possibile includere valori di stringa predefiniti all'interno del codice come letterali di stringa. Un valore letterale di stringa è una sequenza di caratteri nel codice racchiusa tra virgolette doppie " "
.
Di seguito è riportato un esempio di come creare una variabile di stringa denominata Hello e inizializzarla con il valore letterale di stringa "Hello world"
:
Hello : string = "Hello world"
Codifica dei caratteri
La codifica dei caratteri è la mappatura tra un carattere di testo e i dati che il computer può comprendere, chiamata punto di codice.
Verse utilizza lo schema di codifica dei caratteri Unicode UTF-8, ovvero uno standard sviluppato da Unicode Consortium per fornire un supporto confrontabile dei caratteri tra lingue, piattaforme e dispositivi.
Ad esempio, l'emoji in questa stringa "🐈"
può essere rappresentata anche dal punto di codice Unicode dell'emoji "{0u1f408}"
. Per un elenco completo dei caratteri supportati in Unicode e dei corrispondenti punti di codice, fai riferimento alla documentazione Unicode.
L'unità di codice UTF-8 è 8-bit (un byte), e codifica i caratteri con punti di codice lunghi da uno a quattro byte. I punti di codice con un valore inferiore utilizzano meno byte rispetto ai punti di codice con valori più alti. Ad esempio, "a"
utilizza un byte "{0o61}"
, mentre "á"
utilizza due byte "{0oC3}{0oA1}"
.
Operazioni sulle stringhe
Le stringhe supportano concatenazione, confronto, indicizzazione, ottenendo la lunghezza della stringa e l'interpolazione della stringa.
Concatenazione
La concatenazione si verifica quando una stringa viene aggiunta a un'altra stringa. È possibile utilizzare l'operatore +
per concatenare più stringhe.
Ad esempio, il codice seguente genera la variabile Announcement
che contiene la stringa "...E il vincitore è: giocatore uno!"
.
# Nome del vincitore:
WinningPlayerName : string = "Giocatore uno"
# Crea un messaggio che annuncia il vincitore.
Announcement : string = "...E il vincitore è: " + WinningPlayerName + "!"
Interpolazione delle stringhe
È possibile inserire un valore in una stringa se dispone di una funzione ToString()
valida definita nell'ambito corrente.
Ad esempio, il codice seguente genera la variabile Announcement
che contiene la stringa "...E il vincitore è: giocatore uno!"
.
# Nome del vincitore:
WinningPlayerName : string = "Giocatore uno"
# Crea un messaggio che annuncia il vincitore.
Announcement : string = "...E il vincitore è: {WinningPlayerName}!"
Confronto
La parità di due stringhe dipende dall'utilizzo degli stessi caratteri.
Il confronto delle stringhe in Verse si esegue confrontando i punti di codice di ciascun carattere. Il confronto di due stringhe fa distinzione tra maiuscole e minuscole poiché i caratteri maiuscoli e minuscoli hanno punti di codice diversi.
È possibile utilizzare l'operatore fallibile =
per verificare che due stringhe siano uguali e l'operatore fallibile <>
per verificarne invece la disuguaglianza.
Esistono diversi modi per rappresentare lo stesso carattere in Unicode. Ad esempio, "é"
è "{0u0049}"
, ma è possibile utilizzare anche due punti di codice: "{0u0065}”
che è "e"
e "{0u0301}"
che è un accento combinato. Ciò significa che se si confrontano queste stringhe, che sembrano entrambe essere il carattere "é"
ma le stringhe utilizzano punti di codice diversi, le stringhe non saranno uguali. "{0u0049}"
non è uguale a "{0u0065}{0u0301}"
.
L'esempio seguente consente di verificare se il giocatore ha utilizzato l'elemento corretto per progredire in un gioco di avventura/puzzle:
# Questo è l'elemento che il puzzle richiede per sbloccare il passaggio successivo:
ExpectedItemInternalName : string = "RedPotion"
# Questo è l'elemento che il giocatore ha selezionato:
SelectedItemInternalName : string = "BluePotion"
# Controlla se il giocatore ha selezionato l'elemento giusto.
if (SelectedItemInternalName = ExpectedItemInternalName):
# Sì! Segnala che il puzzle può procedere al passaggio successivo.
return true
# No. Segnala che questo elemento non fa avanzare il puzzle.
return false
Lunghezza
È possibile ottenere il numero di unità di codice UTF-8 in una stringa accedendo al membro Length
sulla stringa. Ad esempio, "hey".Length
è 3.
La lunghezza di una stringa rappresenta la quantità di dati necessari per rappresentare la stringa nelle unità di codice UTF-8. Ad esempio, "héy".Length
è 4 perché è necessaria un'unità di codice UTF-8 aggiuntiva per rappresentare il carattere é
, anche se la stringa sembra avere tre caratteri. Nel codice seguente viene visualizzato un timer "secondi" con due cifre. Riempirà il display con uno zero iniziale, se necessario.
# Si presume che SecondsRemaining sia non negativo
SecondsRemaining : int = 30
# Converte automaticamente la rappresentazione int in una stringa:
SecondsString:string = SecondsRemaining
# Imposta la stringa di visualizzazione del timer.
var Combined : string = "Tempo rimanente: "
# Se la stringa è troppo lunga, sostituiscila con il valore massimo a due cifre, 99.
if (SecondsString.Length > 2):
# Troppo tempo sull'orologio! Imposta la stringa su un valore max hardcoded.
set Combined += "99"
else if (SecondsString.Length < 2):
# Riempi il display con uno zero iniziale.
set Combined += "0{SecondsString}"
else:
# La stringa ha già la lunghezza esatta, quindi aggiungila.
set Combined += SecondsString
Indice
È possibile accedere all'unità di codice UTF-8 in un indice specifico della stringa. La prima unità di codice UTF-8 in una stringa ha un indice pari a 0 e ogni indice di unità di codice successivo aumenta di numero.
Ad esempio, "cat"[0]
è "c"
e "cat"[1]
è "a"
.
Indice | 0 | 1 | 2 |
Carattere | "c" |
"a" |
"t" |
Unità di codice | "{0o63}" |
"{0o61}" |
"{0o74}" |
Nei casi in cui una stringa contiene caratteri rappresentati da più unità di codice, viene visualizzato un indice per ogni unità di codice. Ad esempio, "á"
è rappresentato da due unità di codice UTF-8 "{0oC3}{0oA1}"
, quindi "cát"[1]
è "{0oC3}"
e "cát"[2]
è "{0oA1}"
.
Indice | 0 | 1 | 2 | 3 |
Carattere | "c" |
"á" |
"t" |
|
Unità di codice | "{0o63}" |
"{0oC3}" |
"{0oA1}" |
"{0o74}" |
L'ultimo indice in una stringa è inferiore alla lunghezza della stringa. Ad esempio, "cat".Length
è 3 e l'indice per "t"
in "cat"
è 2.
Libreria standard
La libreria standard fornisce funzioni per facilitare la creazione e l'utilizzo di stringhe. Per maggiori dettagli su queste funzioni, consulta la guida API di Verse.
Rappresentazioni alternative di caratteri
Alcuni caratteri hanno rappresentazioni alternative quando vengono utilizzati in una stringa. Ad esempio, "{}"
si può utilizzare per l'interpolazione di stringa o per i punti di codice dei caratteri, ma si può utilizzare anche come caratteri parentesi graffe {} nel testo.
Per utilizzare una rappresentazione alternativa di un carattere in una stringa, è necessario aggiungere il carattere escape "\"
prima del carattere nella stringa. Ad esempio, "\{\}"
viene visualizzato come {} nel testo e "\n"
inizia una nuova riga nel testo.
Dettagli di implementazione
Il tipo string
e un alias di tipo di []char
, un array delle unità di codice UTF-8. Poiché string è un alias di tipo per un array, string ha lo stesso comportamento degli array.
Ci sono due tipi primitivi per i caratteri, a seconda della loro dimensione e del formato del punto di codice: char
e char32
. Le uniche funzionalità di char
e char32
in Verse sono per il confronto e per accedere ai loro valori.
Tipo primitivo | Descrizione | Formati supportati |
---|---|---|
char | Tipo primitivo che rappresenta una singola unità di codice UTF-8 (un byte), fino al valore 256 (0off ). |
Unità di codice con formato 0oXX. Ad esempio, 0o52 . |
char32 | Tipo primitivo che rappresenta un punto di codice Unicode. | Punti di codice del formato 0uXXXX. Ad esempio, 0u0041 . |
È anche possibile esprimere valori letterali con virgolette singole. Se il tipo primitivo della stringa tra virgolette singole è char
o char32
dipende dalle unità di codice UTF-8 utilizzate per il carattere. Ad esempio, 'e'
e char
e 'é'
è char32
.
Tipo persistente
I valori di stringa, char e char32 sono tutti persistenti, ovvero è possibile utilizzarli nelle variabili weak_map
con ambito modulo e far sì che i loro valori siano mantenuti tra le sessioni di gioco. Per maggiori dettagli sulla persistenza in Verse, consulta Utilizzo dei dati persistenti in Verse.