Krotka jest zgrupowaniem co najmniej dwóch wyrażeń, które jest traktowane jako jedno wyrażenie.
Krotka o wartości literał ma wiele wyrażeń pomiędzy ()
, z elementami rozdzielonymi przecinkami:
(1, 2, 3)
Kolejność elementów w krotce jest ważna. Następująca krotka różni się od poprzedniego przykładu krotki:
(3, 2, 1)
Jedno wyrażenie może się również znajdować w wielu pozycjach w krotce:
("Pomóż mi Rhonda", "Pomóż", "Pomóż mi Rhonda")
Krotka może zawierać wyrażenia dowolnego typu, a nawet różnych typów, (w przeciwieństwie do tablic, które mogą zawierać wyłącznie elementy jednego typu):
(1, 2.0, "three")
Krotki mogą nawet zawierać inne krotki:
(1, (10, 20.0, "thirty"), "three")
Jeśli te pojęcia są ci znane, oto jak można sobie wyobrazić krotkę:
- Struktura danych bez nazwy z uporządkowanymi elementami bez nazwy
- Tablica o stałym rozmiarze, w której każdy element może być innego typu
Krotki są szczególnie przydatne do:
- Zwracanie wielu wartości z funkcji.
- Proste grupowanie na miejscu jest bardziej zwięzłe niż wysiłek związany z przygotowaniem w pełni zdefiniowanej struktury danych wielokrotnego użytku (takiej jak struktura lub klasa).
Określanie zmiennej jako typu krotki
Aby określić typ zmiennej jako krotkę, przed typami rozdzielonymi przecinkami ujętymi w ()
stosuje się przedrostek tuple
(krotka):
MyTupleInts : tuple(int, int, int) = (1, 2, 3)
MyTupleMixed : tuple(int, float, string) = (1, 2.0, "three")
MyTupleNested : tuple(int, tuple(int, float, string), string) = (1, (10, 20.0, "thirty"), "three")
Typy krotek można również wywnioskować:
MyTupleInts := (1, 2, 3)
MyTupleMixed := (1, 2.0, "three")
MyTupleNested := (1, (10, 20.0, "thirty"), "three")
Typy krotki specyfikatory mogą być używane w danych elementy składowe danych i sygnaturach typu funkcji do parametrów lub zwracać typ:
ExampleFunction(Param1 : tuple(string, int), Param2 : tuple(int, string)) : tuple(string, int) =
# Użycie parametru jako wyniku
Param1
Dostęp do elementu krotki
Dostęp do elementów krotki można uzyskać za pomocą bezbłędnego, liczonego od zera indeksu operatora, który przyjmuje wartość liczby całkowitej (integer). Operator indeksu nie może zakończyć się niepowodzeniem (w przeciwieństwie do operatora indeksu tablicy [index]
, który może zakończyć się niepowodzeniem), ponieważ kompilator zawsze zna liczbę elementów dowolnych krotek, dlatego każdy indeks wykraczający poza zakres będzie powodował błąd czasu kompilacji:
MyTuple := (1, 2.0, "three")
MyNestedTuple := (1, (10, 20.0, "thirty"), "three")
var MyInt: int = MyTuple(0)
var MyFloat: float = MyTuple(1)
var MyString: string = MyTuple(2)
Print("Moje zmienne: {MyInt}, {MyFloat}, {MyString}")
Print("Mój zagnieżdżony element krotki: {MyNestedTuple(1)(2)}")
Wymuszenie tablicy krotki
Krotki można przekazywać za każdym razem, gdy oczekiwana jest tablica, pod warunkiem że wszystkie elementy krotki są tego samego typu, jak w tablicy. Nie można natomiast przekazywać tablic tam, gdzie oczekiwana jest krotka.
Rozszerzenie krotki
W przypadku krotki przekazanej jako pojedynczy element funkcji, będzie to wyglądało tak, jakby funkcja była wywoływana z każdym z elementów krotki osobno. Jest to tzw. rozszerzenie krotki lub splatting.
F(Arg1 : int, Arg2 : string) : void =
DoStuff(Arg1, Arg2)
G() : void =
MyTuple := (1, "two")
F(MyTuple(0), MyTuple(1)) # Dostęp do elementów
F(MyTuple) # Rozszerzenie krotki
Wyrażenie sync
współbieżność strukturalna posiada krotkę wynik, która umożliwia kilku argumentom, które są oceniane w miarę upływu czasu, aby były oceniane jednocześnie. Aby dowiedzieć się więcej, patrz Współbieżność.
Typ możliwy do persystencji
Krotka jest możliwa do persystencji, jeśli typ elementu w krotce jest możliwy do persystencji. Jeśli krotka jest możliwa do persystencji, oznacza to, że możesz jej 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.