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/3Keyword.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/3key의 기존 값을 새 값으로 바꿔요. put_new/3key가 없을 때만 값을 넣어요.

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/2key의 모든 항목을 지우고, 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 모듈: 접근 문법과 동작