원소를 찾고 컬렉션의 순서를 유지하거나 내용을 바꿔 보세요. 위치로 접근할 때는 Array, 키와 값을 연결할 때는 Map, 중복을 없앨 때는 Set을 씁니다.
첫 프로그램에서 토파즈를 설치하세요. 컬렉션 문법은 컬렉션과 컴프리헨션에서 확인할 수 있습니다.
Array, Map, Set 함께 사용하기
다음 코드를 collections.tpz로 저장하세요.
let 과제들 = ["draft", "check", "ship"]
let 선택 = 과제들.get(1)
let mut 점수들: Map<string, int> = Map.new()
점수들.insert("ada", 10)
점수들.insert("lin", 12)
let mut 레이블들 = Set.of("docs")
레이블들.add("tests")
print("{선택}:{점수들.get("lin")}:{점수들.keys}:{레이블들.toArray()}")파일을 저장한 폴더에서 topaz run collections.tpz를 실행하세요.
Some(check):Some(12):[ada, lin]:[docs, tests]과제들.get(1)은 "check"를, 점수들.get("lin")은 12를 찾습니다. 찾는 값이 있으므로 각각 Some을 반환합니다. 인덱스나 키가 없으면 None을 반환합니다.
점수들.keys는 삽입 순서대로 [ada, lin]을 반환합니다. 레이블들.toArray()도 같은 방식으로 [docs, tests]를 반환합니다. 이 배열은 그때의 원소를 복사한 스냅샷입니다. 원래 컬렉션에 항목을 추가하거나 삭제해도 이 배열은 바뀌지 않습니다.
작업에 맞는 연산 고르기
| 하려는 일 | 호출 | 결과 |
|---|---|---|
| 없을 수도 있는 배열 위치 읽기 | items.get(index) | Option<T>, 인덱스가 없으면 None |
| 반드시 있어야 하는 위치 읽기 | items[index] | T, 인덱스가 잘못되면 실행 오류 |
| 맵 키 찾기 | values.get(key) | Option<V> |
| 키가 없으면 기본값 사용 | values.getOr(key, default) | V |
| 세트에 값이 있는지 확인 | values.contains(value) | bool |
| 맵 키·값·항목을 순서대로 복사 | keys, values, entries | 삽입 순서의 스냅샷 |
| 원소 변환과 정렬 | map, filter, sorted | 새 컬렉션 |
| 기존 컬렉션 변경 | let mut 바인딩의 변경 메서드 | 원래 컬렉션 변경 |
안전한 조회, 변경, 실행 오류
Array의 get, indexOf는 Option을 반환합니다. pop, removeAt도 Option을 반환하며 배열을 바꾸므로 let mut이 필요합니다.
slice(start, end)는 start부터 end 직전까지 원소를 복사합니다. 범위가 배열 밖으로 나가면 배열 경계에 맞춥니다. 직접 인덱싱과 잘못된 위치의 insert는 실행 오류(fault)를 일으킵니다. 없는 위치가 정상 입력일 수 있으면 get을 쓰세요.
| 컬렉션 | 기존 값을 바꾸는 메서드 | 새 컬렉션을 반환하는 메서드 |
|---|---|---|
Map | insert, remove, clear, update | mapValues, filter |
Set | add, remove, clear | union, intersection, difference |
Map의 remove는 Option을 반환합니다. Map의 containsKey, Set의 contains, remove는 bool을 반환합니다.
Map의 mapValues, filter는 남은 키의 순서를 유지합니다. 기존 키의 값을 바꿔도 위치는 그대로입니다. 키를 지운 뒤 다시 넣으면 맨 뒤로 갑니다. Set의 합집합·교집합·차집합 연산은 각 연산에 지정된 원소 순서를 따릅니다.
이 기본 컬렉션 메서드는 Result를 반환하지 않습니다. 파일 읽기나 파서가 Result를 반환하면 Ok나 Err를 처리한 뒤 컬렉션을 사용하세요.
거부된 연산 고치기
- 맵 키가 있는지 확인하려면
map.containsKey(x)나x in map.keys를 쓰세요. 검사기는x in map을 거부합니다. - 문자열의 스칼라 수는
text.scalars().length로 셉니다. 문자열에는.length속성이 없습니다. - 불변 바인딩에서 변경 메서드가 거부되면, 변경이 필요한 바인딩을
let mut으로 선언하세요. - Map 키와 Set 원소는 키로 쓸 수 있는 타입이어야 합니다. 내부에 담긴 값과 필드에도 같은 조건이 적용됩니다. 잘못된 타입은 검사기가 거부합니다.
Map과Set에는 일반 동등성 연산이 없습니다. 조회 메서드는 개별 키나 원소를 확인합니다.
콜백은 컬렉션에 지정된 순회 순서대로 실행됩니다. 값 없음을 처리하려면 Null·Option·결과·fault로 이어 가세요. 다른 작업은 표준 라이브러리 개요에서 찾으세요.