Verse wykorzystuje wartość string
jako typ do przechowywania i obsługi tekstu, takiego jak "Hello Verse"
i "Epic Games"
. Ciąg tekstowy (string) w języku Verse może zawierać litery, cyfry, znaki interpunkcyjne, spacje i emoji. Ciąg tekstowy niezawierający żadnych znaków ""
jest nazywany pustym ciągiem tekstowym.
Wstępnie zdefiniowane wartości ciągu tekstowego (string) można uwzględnić w kodzie jako literały ciągu tekstowego. Literał ciągu tekstowego to sekwencja znaków w kodzie otoczona podwójnymi cudzysłowami " "
.
Poniżej zaprezentowano przykład utworzenia zmiennej string o nazwie Hello, inicjowanej za pomocą literału string "Witaj, świecie"
:
Hello : string = "Witaj, świecie"
Kodowanie znaków
Kodowanie znaków to mapowanie między znakiem tekstowym a zrozumiałymi dla komputera danymi zwanymi punktem kodowym.
Verse wykorzystuje schemat kodowania znaków Unicode UTF-8, standard kodowania znaków opracowany przez konsorcjum Unicode w celu zapewnienia porównywalnej obsługi znaków w różnych językach, na różnych platformach i urządzeniach.
Na przykład emoji w tym ciągu "🐈"
może być również reprezentowane przez punkt kodowy Unicode dla tego emoji "{0u1f408}"
. Pełną listę znaków obsługiwanych w Unicode i odpowiadających im punktów kodowych znajdziesz w dokumentacji Unicode.
Jednostka kodowa UTF-8 jest 8-bitowa (jeden bajt) i koduje znaki za pomocą punktów kodowych o długości od jednego do czterech bajtów. Punkty kodowe o niższych wartościach zużywają mniej bajtów niż punkty kodowe o wyższych wartościach. Na przykład "a"
używa jednego bajtu "{0o61}"
, podczas gdy "á"
używa dwóch bajtów "{0oC3}{0oA1}"
.
Operacje z użyciem typu string
Ciągi tekstowe obsługują połączenie, porównanie, indeksowanie, pobieranie długości ciągu oraz interpolację ciągu tekstowego.
Połączenie
Połączenie ma miejsce, gdy ciąg tekstowy jest dołączany do innego ciągu tekstowego. Do łączenia ciągów tekstowych można użyć operatora +
.
Na przykład, poniższy kod powoduje, że zmienna Announcement
zawiera ciąg tekstowy "...Zwycięzcą zostaje: Gracz numer jeden!”
.
# Nazwa zwycięskiego gracza:
WinningPlayerName : string = "Gracz numer jeden"
# Utwórz komunikat z ogłoszeniem zwycięzcy.
Announcement : string = "...Zwycięzcą zostaje: " + WinningPlayerName + "!"
Interpolacja ciągu tekstowego
Wartość do ciągu tekstowego można wprowadzić, jeśli posiada on poprawną funkcję ToString()
zdefiniowaną w bieżącym zakresie.
Na przykład, poniższy kod powoduje, że zmienna Announcement
zawiera ciąg tekstowy "...Zwycięzcą zostaje: Gracz numer jeden!”
.
# Nazwa zwycięskiego gracza:
WinningPlayerName : string = "Gracz numer jeden"
# Utwórz komunikat z ogłoszeniem zwycięzcy.
Announcement : string = "...Zwycięzcą jest: {WinningPlayerName}!"
Porównanie
To, czy dwa ciągi tekstowe są równe, zależy od tego, czy używają tych samych znaków.
Porównywanie ciągów tekstowych w Verse odbywa się poprzez porównywanie punktów kodowych każdego znaku. Porównywanie dwóch ciągów tekstowych uwzględnia wielkość liter, ponieważ wielkie i małe litery mają różne punkty kodowe.
Za pomocą zawodnego operatora =
można przetestować, czy dwa ciągi tekstowe są równe, natomiast zawodny operator <>
pozwala stwierdzić brak równości.
Istnieje wiele sposobów reprezentowania tego samego znaku w Unicode. Na przykład litera "é"
to "{0u0049}"
, ale można też użyć dwóch punktów kodowych: "{0u0065}"
, czyli "e"
, oraz "{0u0301}"
, czyli akcentu łączącego. Zatem mimo że oba ciągi tekstowe wyglądają na znak "é"
, to używają różnych punktów kodowych. To oznacza, że jeśli porównasz te ciągi tekstowe, to nie będą one równe. "{0u0049}"
nie jest tym samym co "{0u0065}{0u0301}"
.
W poniższym przykładzie sprawdzimy, czy gracz użył odpowiedniego przedmiotu, aby dokonać postępu w grze przygodowej/łamigłówce:
# To jest przedmiot wymagany do odblokowania kolejnego etapu łamigłówki:
ExpectedItemInternalName : string = "RedPotion"
# To jest przedmiot wybrany przez gracza:
SelectedItemInternalName : string = "BluePotion"
# Sprawdź, czy gracz wybrał odpowiedni przedmiot.
if (SelectedItemInternalName = ExpectedItemInternalName):
# Zgadza się! Zgłoś, że łamigłówka może przejść na kolejny poziom.
return true
# Niestety nie. Zgłoś, że ten przedmiot nie powoduje postępu w łamigłówce.
return false
Długość
Liczbę jednostek kodowych UTF-8 w ciągu tekstowym można określić, uzyskując dostęp do elementu Length
ciągu tekstowego. Na przykład wartość "hey".Length
to 3.
Długość ciągu tekstowego odpowiada ilości danych potrzebnych do przedstawienia ciągu w jednostkach kodowych UTF-8. Na przykład wartość "héy".Length
to 4, ponieważ wymaga dodatkowej jednostki kodowej UTF-8 do reprezentowania znaku é
, mimo że ciąg składa się pozornie z trzech znaków. Poniższy kod wyświetla "sekundowy" licznik czasu z dwiema cyframi. W razie potrzeby uzupełni wyświetlaną wartość o zero na początku.
# Zakładamy, że wartość SecondsRemaining jest nieujemna
SecondsRemaining : int = 30
# Automatycznie przekonwertuj wartość int na string:
SecondsString:string = SecondsRemaining
# Skonfiguruj wyświetlany ciąg tekstowy licznika czasu.
var Combined : string = "Pozostały czas: "
# Jeśli ciąg tekstowy jest za długi, zastąp go maksymalną dwucyfrową wartością, 99.
if (SecondsString.Length > 2):
# Za dużo czasu na zegarze! Ustaw ciąg tekstowy na zakodowaną wartość maksymalną.
set Combined += "99"
else if (SecondsString.Length < 2):
# Uzupełnij wyświetlaną wartość o zero na początku.
set Combined += "0{SecondsString}"
else:
# Ciąg ma już dokładną długość, więc dodaj go.
set Combined += SecondsString
Indeks
Dostęp do jednostki kodowej UTF-8 można uzyskać pod określonym indeksem ciągu tekstowego. Pierwsza jednostka kodowa UTF-8 w ciągu tekstowym ma indeks 0, a każdy kolejny indeks jednostki kodowej ma coraz większą wartość.
Na przykład "cat"[0]
to "c"
, a "cat"[1]
to "a"
.
Indeks | 0 | 1 | 2 |
Znak | "c" |
"a" |
"t" |
Jednostka kodowa | "{0o63}" |
"{0o61}" |
"{0o74}" |
W przypadkach, gdy ciąg tekstowy zawiera znaki reprezentowane przez więcej niż jedną jednostkę kodową, dla każdej jednostki kodowej zostanie utworzony indeks. Na przykład "á"
jest reprezentowane przez dwie jednostki kodowe UTF-8 "{0oC3}{0oA1}"
, dlatego "cát"[1]
to "{0oC3}"
, a "cát"[2]
to "{0oA1}"
.
Indeks | 0 | 1 | 2 | 3 |
Znak | "c" |
"á" |
"t" |
|
Jednostka kodowa | "{0o63}" |
"{0oC3}" |
"{0oA1}" |
"{0o74}" |
Ostatni indeks w ciągu tekstowym jest o jeden mniejszy od długości ciągu tekstowego. Na przykład wartość "cat".Length
to 3, a indeks znaku "t"
w ciągu "cat"
to 2.
Biblioteka standardowa
Biblioteka standardowa (verse-glossary#standard-library) zawiera funkcje, które ułatwiają tworzenie i stosowanie ciągów tekstowych (string). Więcej szczegółów na temat tych funkcji zawiera sekcja Odwołania do interfejsu API Verse.
Alternatywne reprezentacje znaków
Niektóre znaki są reprezentowane alternatywnie, gdy są używane w ciągu tekstowym. Na przykład nawiasów klamrowych "{}"
można używać do interpolacji ciągu tekstowego lub do punktów kodowych znaków, ale także jako samych znaków nawiasów {} w tekście.
Aby móc użyć alternatywnej reprezentacji znaku w ciągu tekstowym, należy dodać znak ucieczki "\"
przed danym znakiem w ciągu. Na przykład znaki w tekście "\{\}"
są renderowane jako {}, a "\n"
rozpoczyna nowy wiersz.
Szczegóły dotyczące implementacji
Typ string
jest aliasem typu []char
, tablicą jednostek kodu UTF-8. Ze względu na to, że ciąg tekstowy (string) jest aliasem typu tablicy, zachowuje się tak samo jak tablice.
Istnieją dwa typy proste dla znaków, w zależności od ich rozmiaru i formatu punktu kodowego – char
i char32
. Jedyne możliwości char
i char32
w Verse to porównywanie i dostęp do ich wartości.
Typ prosty | Opis | Obsługiwane formaty |
---|---|---|
char | Typ prosty, który reprezentuje pojedynczą jednostkę kodową UTF-8 (jeden bajt), do wartości 256 (0off ). |
Jednostki kodowe w postaci 0oXX. Na przykład 0o52 . |
char32 | Typ prosty reprezentujący punkt kodowy Unicode. | Punkty kodowe postaci 0uXXXX. Na przykład 0u0041 . |
Literały można również wyrażać za pomocą pojedynczych cudzysłowów. To, czy typem prostym ciągu tekstowego w pojedynczych cudzysłowach jest char
czy char32
, zależy od jednostek kodowych UTF-8 użytych dla znaku. Na przykład 'e'
jest typu char
, a 'é'
jest typu char32
.
Typ możliwy do persystencji
Wartości typu string, char i char32 są wszystkie możliwe do utrwalenia, co oznacza, że możesz ich użyć w zmiennych weak_map
o zasięgu modułowym i zachować ich wartości podczas sesji gry. Więcej informacji na temat persystencji w Verse znajdziesz w artykule Używanie persystentnych danych w Verse.