map은 키-값 쌍을 가지는 컨테이너 타입으로, 하나의 값에 다른 값을 매핑합니다. 맵의 엘리먼트 순서는 맵을 생성할 때의 키-값 쌍 순서를 따르며, 맵의 엘리먼트에는 정의한 고유 키를 통해 액세스할 수 있습니다.
예를 들어 특정 단어가 몇 번 나오는지 세고 싶다면, 단어를 키로 하고 횟수를 값으로 갖는 맵을 만들 수 있습니다.
WordCount : [string]int = map{"apple" => 11, "pear" => 7}이미지를 클릭하면 확대됩니다.
맵을 초기화할 때 같은 키를 여러 번 사용하면, 키에 마지막으로 할당한 값만 맵에 저장됩니다. 다음 예시에서 WordCount는 "apple" => 2 키-값 쌍만 가집니다. "apple" => 0 및 "apple" => 1 쌍은 버려집니다.
WordCount : [string]int = map{"apple" => 0, "apple" => 1, "apple" => 2}지원되는 키 타입
키 타입이 comparable이라면 키-값 쌍은 어떤 타입의 조합이든 될 수 있습니다. 키가 맵에 이미 존재하는지 확인할 수 있어야 하기 때문입니다.
다음 타입들을 키로 사용할 수 있습니다.
comparable인 경우 클래스
엘리먼트 타입이 comparable인 옵션
엘리먼트 타입이 comparable인 배열
키와 값의 타입이 모두 comparable인 맵
모든 엘리먼트가 comparable인 튜플
맵의 길이
맵의 Length 필드에 액세스하면 맵 내 키-값 쌍의 수를 구할 수 있습니다. 예를 들어 map{"a" => "apple", "b" => "bear", "c" => "candy"}.Length는 3을 반환합니다.
맵의 엘리먼트 액세스하기
WordCount["apple"]와 같이 키를 통해 맵의 엘리먼트에 액세스할 수 있습니다.
맵의 엘리먼트에 액세스하는 것은 실패 가능 표현식이므로 if 표현식과 같은 실패 컨텍스트에서만 사용할 수 있습니다. 예를 들면 다음과 같습니다.
ExampleMap : [string]string = map{"a" => "apple", "b" => "bear", "c" => "candy"}
for (Key->Value : ExampleMap):
Print("{Value} in ExampleMap at key {Key}")키 | "a" | "b" | "c" |
값 | "apple" | "bear" | "candy" |
맵에서 엘리먼트 추가 및 수정하기
맵에서 키를 특정 값으로 설정하여 엘리먼트를 맵 변수에 추가할 수 있습니다. 예를 들면 set ExampleMap["d"] = 4와 같습니다. 기존 키-값 쌍도 이와 유사하게 맵에 이미 있는 키에 값을 할당하여 업데이트할 수 있습니다.
맵에 엘리먼트를 추가하는 것은 실패 가능 표현식이므로 if 표현식과 같은 실패 컨텍스트에서만 사용할 수 있습니다. 예를 들면 다음과 같습니다.
var ExampleMap : [string]int = map{"a" => 1, "b" => 2, "c" => 3}
# Modifying an existing element
if (set ExampleMap["b"] = 3, ValueOfB := ExampleMap["b"]):
Print("Updated key b in ExampleMap to {ValueOfB}")
# Adding a new element
if (set ExampleMap["d"] = 4, ValueOfD := ExampleMap["d"]):
Print("Added a new key-value pair to ExampleMap with value {ValueOfD}")맵에서 엘리먼트 제거하기
제거할 키를 제외한 새 맵을 생성하여 엘리먼트를 맵 변수에서 제거할 수 있습니다. [string]int 맵에서 제거를 제공하는 함수의 예시는 아래와 같습니다.
# Removes an element from the given map and returns a new map without that element
RemoveKeyFromMap(ExampleMap:[string]int, ElementToRemove:string):[string]int=
var NewMap:[string]int = map{}
# Concatenate Keys from ExampleMap into NewMap, excluding ElementToRemove
for (Key -> Value : ExampleMap, Key <> ElementToRemove):
set NewMap = ConcatenateMaps(NewMap, map{Key => Value})
return NewMapWeak 맵
weak_map 타입은 map 타입의 수퍼타입입니다. weak_map은 대부분의 경우 map 타입과 비슷한 방식으로 사용할 수 있지만, 다음과 같은 예외가 있습니다.
weak_map에는Length멤버가 없기 때문에weak_map에 포함된 엘리먼트의 수를 쿼리할 수 없습니다.weak_map의 엘리먼트를 통해 반복작업할 수 없습니다.weak_map에서ConcatenateMaps()를 사용할 수 없습니다.
또 다른 차이점은 weak_map에 대한 타입 정의를 위해서는 weak_map 함수를 사용하여 키-값 쌍 타입을 정의해야 한다는 것입니다. 예를 들어 MyWeakMap:weak_map(string, int) = map{}은 integer 값으로 스트링 키가 쌍을 이루게 될 MyWeakMap이라는 weak 맵을 정의합니다. weak_map은 map의 수퍼타입이므로, 표준 map{}으로 초기화할 수 있습니다.
다음은 weak_map 변수를 생성하고 weak 맵의 엘리먼트에 액세스하는 예시를 보여줍니다.
ExampleFunction():void=
var MyWeakMap:weak_map(int, int) = map{} # Supertype of the standard map, so it can be assigned from the standard map
if:
set MyWeakMap[0] = 1 # Same means of mutation of a particular element as the standard map
then:
if (Value := MyWeakMap[0]):
Print("Value of map at key 0 is {Value}")
set MyWeakMap = map{0 => 2} # Same means of mutation of the entire map as the standard map퍼시스턴스 타입
키 및 값 타입이 모두 퍼시스턴트 가능일 때 맵이 퍼시스턴트 가능합니다. 맵이 퍼시스턴스인 경우 모듈 스코프 weak_map 변수에서 이 타입을 사용할 수 있으며 전체 게임 세션에서 값이 유지됩니다. Verse의 퍼시스턴스에 대한 자세한 내용은 Verse에서 퍼시스턴스 데이터 사용하기를 확인하세요.