Keyword 모듈
Keyword 모듈
키워드 리스트(keyword list)는 두 요소로 된 튜플만으로 이루어진 리스트예요. 이 튜플의 첫 번째 요소는 **키(key)**라고 부르고 반드시 아톰이어야 해요. 두 번째 요소인 **값(value)**은 어떤 term이든 될 수 있어요.
키워드는 주로 선택적(optional) 값을 다루는 데 쓰여요. 키워드와 맵을 비교하는 일반적인 소개는 Keyword and Maps 가이드를 참고하세요.
출처: Keyword
본문
예를 들어 다음은 키워드 리스트예요.
[{:exit_on_close, true}, {:active, :once}, {:packet_size, 1024}]
Elixir는 키워드 리스트를 위한 더 간결한 특별 문법을 제공해요.
[exit_on_close: true, active: :once, packet_size: 1024]
두 문법은 정확히 같은 값을 돌려줘요.
키는 유니코드 문자, 숫자, 밑줄, @ 기호로 이루어진 어떤 아톰이든 될 수 있어요. 공백 같은 다른 문자가 있다면 따옴표로 감쌀 수 있어요.
iex> ["exit on close": true]
["exit on close": true]
아톰을 따옴표로 감싸도 문자열이 되진 않아요. 키워드 리스트의 키는 항상 아톰이에요. 따옴표는 필요할 때만 쓰고, 그러지 않으면 Elixir가 경고를 냅니다.
중복 키와 순서
키워드는 중복 키를 가질 수 있어서 엄밀히는 키-값 타입이 아니에요. 그럼에도 이 모듈의 대부분 함수는 키-값 구조로 동작하며 Map 모듈의 함수와 비슷하게 동작해요. 예를 들어 Keyword.get/3은 중복 항목이 있어도 주어진 키에 매칭되는 첫 번째 항목을 가져와요. 마찬가지로 Keyword.put/3과 Keyword.delete/2는 호출 시 주어진 키의 중복 항목을 모두 제거해요. 다만 키워드 리스트 연산은 키를 찾기 위해 전체 리스트를 순회해야 하므로 맵보다 느려요.
중복 키를 다루는 함수도 몇 개 있어요. get_values/2는 주어진 키의 모든 값을 돌려주고, delete_first/2는 기존 항목 중 첫 번째만 지워요.
리스트는 기존 순서를 보존하지만 Keyword 함수는 어떤 순서도 보장하지 않아요. 예를 들어 Keyword.put(opts, new_key, new_value)를 호출해도 new_key가 어디(앞, 끝, 그 사이)에 추가될지 보장이 없어요.
순서가 보장되지 않으므로 키워드 리스트에 패턴 매칭하는 것도 권장하지 않아요.
주요 함수
get/3
get(keywords, key, default \ nil)
key에 해당하는 값을 돌려줍니다. 키가 없으면 default를 돌려줘요.
iex> Keyword.get([a: 1, b: 2], :a)
1
iex> Keyword.get([a: 1, b: 2], :c, 0)
0
fetch!/2
fetch!(keywords, key)
key에 해당하는 값을 돌려주되, 없으면 KeyError를 던져요.
iex> Keyword.fetch!([a: 1], :a)
1
iex> Keyword.fetch!([a: 1], :b)
** (KeyError) key :b not found in: [a: 1]
put/3, put_new/3
put(keywords, key, value)
put_new(keywords, key, value)
put/3은 key의 기존 값을 새 값으로 바꿔요. put_new/3은 key가 없을 때만 값을 넣어요.
delete/2, delete_first/2, pop/3, pop_first/3
delete(keywords, key)
delete_first(keywords, key)
pop(keywords, key, default \ nil)
pop_first(keywords, key, default \ nil)
delete/2는 key의 모든 항목을 지우고, delete_first/2는 첫 항목만 지워요. pop/3은 값을 꺼내면서 {value, new_keywords}를 돌려줍니다.
get_values/2, has_key?/2, keys/1, values/1
get_values(keywords, key)
has_key?(keywords, key)
keys(keywords)
values(keywords)
get_values/2는 주어진 키의 모든 값을 리스트로 돌려주고, has_key?/2는 키 존재 여부를 검사해요. keys/1·values/1은 각각 모든 키·값을 돌려줍니다.
merge/2, merge/3
merge(keywords1, keywords2)
merge(keywords1, keywords2, fun)
두 키워드 리스트를 병합해요. merge/3은 키 충돌을 해결할 함수를 받아요.
keyword?/1
keyword?(term)
주어진 term이 키워드 리스트인지 검사해요.
iex> Keyword.keyword?([foo: 1])
true
iex> Keyword.keyword?([{1, 2}])
false
sort/2, take/2, drop/2, update/4
정렬, 부분 취득·제거, 그리고 키값을 변환하는 update/4(원소가 없으면 초기값 삽입) 등도 제공돼요. 자세한 시그니처는 API 문서를 참고하세요.
더 알아보기
- Keyword lists and maps 가이드: 키워드와 맵 비교
Map모듈: 키-값 구조의 다른 대표 주자Access모듈: 접근 문법과 동작