less than 1 minute read

defmodule MapUtil do
  def empty?(%{}), do: true
  def empty?(map), do: false
end
iex> MapUtil.empty?(%{hello: "elixir"})
true

기대했던 것과 달리 true가 나온다. %{} 변수에는 비어있는 map이 아니라 모든 map이 패턴 매칭된다.

def empty?(map) when map == %{}, do: true

빈 map과 같은지 검사하는 가드 절(guard clause)을 추가하거나

def empty?(map) when map_size(map) == 0, do: true

가드 절에서 호출할 수 있는 함수를 사용해서 검사하면 된다. 호출할 수 있는 함수는 제한되어 있다.

리스트도 그런가 테스트를 해봤는데, 비어있는 list에만 패턴 매칭되네. 순서가 있고 없고의 차이인가? 외우라면 외우겠지만 아직 왜 저렇게 설계했는지는 이유를 잘 모르겠다.

참고 - Pattern match function against empty map - stackoverflow.com