인덱스 시그니처
Coddy Lua 여정의 Luau 소개 섹션에 포함된 레슨 — 73개 중 72번째.
테이블 장에서 {[string]: number}와 같은 맵 타입을 만난 적이 있습니다. 이는 인덱스 시그니처입니다. 어떤 string key든 number 값에 매핑됩니다. 맵 타입은 코드를 작성할 때 keys를 알 수 없는 경우, 즉 카운터, 설정, 캐시, 점수처럼 런타임에 빌드되는 모든 것에서 빛을 발합니다.
type Counts = {[string]: number}
local counts: Counts = {}
counts["potion"] = 3 -- 어떤 문자열 키든 허용됩니다
counts["sword"] = 1
counts["potion"] += 1 -- 값은 숫자로 검사됩니다맵으로 작업할 때 중요한 두 가지 런타임 사실이 있습니다. 첫째, 설정된 적 없는 key를 read하면 nil이 return됩니다. 전형적인 카운팅 패턴은 or를 사용하여 missing을 0으로 변환하여 이를 처리합니다:
counts[item] = (counts[item] or 0) + 1둘째, pairs()는 맵의 keys를 보장되지 않은 순서(no guaranteed order)로 순회합니다. 같은 프로그램을 두 번 실행해도 keys를 방문하는 순서가 다를 수 있습니다. 출력 결과를 예측 가능하게 만들어야 할 때마다 keys를 array로 collect한 뒤, table.sort로 정렬하고, 정렬된 array를 순회하세요:
local keys: {string} = {}
for key in pairs(counts) do
table.insert(keys, key)
end
table.sort(keys)
for _, key in ipairs(keys) do
print(`{key}: {counts[key]}`)
end챌린지
쉬움타입이 지정된 맵을 사용하여 전리품 드롭을 집계하세요.
type Counts = {[string]: number}를 선언하세요.- 각 문자열이 나타나는 횟수를 카운트하여 새로운
Counts맵을 작성하는countItems(items: {string}): Counts를 작성하세요 ((counts[item] or 0) + 1패턴을 사용하세요). local loot: {string} = {"potion", "sword", "potion", "shield", "potion", "sword"}를 생성하고 카운트하세요.- 고유 항목당 한 줄씩 알파벳 순서로
[name]: [count]형태로 출력하세요: 키를 수집하고(collect), 이를table.sort로 정렬한 다음 출력합니다.
예상 출력:
potion: 3
shield: 1
sword: 2직접 해보기
-- 여기에 코드를 작성하세요
-- 1) type Counts = {[string]: number}
-- 2) countItems(items: {string}): Counts를 (counts[item] or 0) + 1을 사용하여
-- 3) 작업의 loot 배열을 세세요
-- 4) 키를 모으고, table.sort로 정렬한 뒤 `{name}: {count}` 줄을 출력하세요
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.