튜플은 단일 표현식으로 취급되는 표현식 두 개 이상을 하나로 묶은 것입니다.
튜플 리터럴은 () 안에 여러 표현식을 가지며, 각 엘리먼트는 쉼표로 구분됩니다.
(1, 2, 3)
튜플 내에서는 엘리먼트의 순서가 중요합니다. 아래 튜플과 위 튜플은 서로 다른 튜플입니다.
(3, 2, 1)
동일한 표현식이 튜플 내 여러 위치에 있을 수 있습니다.
("Help me Rhonda", "Help", "Help me Rhonda")
튜플 표현식은 어떤 타입이든 될 수 있으며, 한 타입의 엘리먼트만 가질 수 있는 배열과 달리 튜플은 여러 타입의 엘리먼트를 가질 수 있습니다.
(1, 2.0, "three")
심지어 튜플이 다른 튜플의 엘리먼트가 될 수도 있습니다.
(1, (10, 20.0, "thirty"), "three")
튜플에 대해 아래의 용어로 정의하는 것이 익숙하실 수도 있습니다.
- 이름이 없고 순서만 있는 엘리먼트들을 갖는 이름 없는 데이터 구조체
- 각 엘리먼트의 타입이 다를 수 있는 고정된 크기의 배열
튜플은 특히 다음과 같은 경우에 유용합니다.
변수를 튜플 타입으로 지정하기
변수를 튜플로 지정하려면 tuple 전위 키워드를 사용하고 () 안에 타입을 콤마로 구분해 넣습니다.
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")
튜플의 타입은 추론될 수도 있습니다.
MyTupleInts := (1, 2, 3)
MyTupleMixed := (1, 2.0, "three")
MyTupleNested := (1, (10, 20.0, "thirty"), "three")
튜플 타입 지정자는 데이터 멤버 또는 함수 시그니처의 파라미터나 반환 타입으로 사용할 수 있습니다.
ExampleFunction(Param1 : tuple(string, int), Param2 : tuple(int, string)) : tuple(string, int) =
# 파라미터를 결과로 사용합니다
Param1
튜플 엘리먼트 액세스
튜플의 엘리먼트는 integer를 받는 인덱스 연산자를 사용해 액세스할 수 있으며, 실패하지 않습니다. 배열의 인덱스 연산자 [index] 는 실패할 수 있는 반면, 튜플 엘리먼트의 개수는 컴파일러가 항상 알 수 있으며 인덱스가 범위를 초과하는 경우 컴파일 타임 오류로 잡아내므로 튜플의 인덱스 연산자는 실패하지 않습니다.
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("My variables: {MyInt}, {MyFloat}, {MyString}")
Print("My nested tuple element: {MyNestedTuple(1)(2)}")
튜플 배열 강제
튜플은 튜플 엘리먼트의 타입이 모두 배열과 동일한 타입인 경우, 배열이 예상되는 위치에 언제나 전달할 수 있습니다. 배열은 튜플이 예상되는 위치에 전달될 수 없습니다.
튜플 확장
튜플이 함수의 단일 엘리먼트로 사용되면 해당 함수가 튜플의 각 엘리먼트와 함께 개별적으로 호출되는 것처럼 간주됩니다. 이를 가리켜 튜플 확장(tuple expansion) 또는 스플랫(splat)이라고 부릅니다.
F(Arg1 : int, Arg2 : string) : void =
DoStuff(Arg1, Arg2)
G() : void =
MyTuple := (1, "two")
F(MyTuple(0), MyTuple(1)) # 엘리먼트 액세스
F(MyTuple) # 튜플 확장
구조적 동시성 표현식 sync 는 결과가 튜플이며, 여러 시점의 실행인자가 동시에 평가됩니다. 자세한 내용은 동시성을 참고하세요.
퍼시스턴스 타입
튜플의 모든 엘리먼트 타입이 퍼시스턴스의 경우 튜플은 퍼시스턴스입니다. 튜플이 퍼시스턴스일 경우, 모듈 스코프 weak_map 변수에서 사용할 수 있고 값이 게임 세션 간에 유지된다는 의미입니다. Verse의 퍼시스턴스에 대한 자세한 내용은 Verse에서 퍼시스턴스 데이터 사용하기를 참고하세요.