检查值是否为关键字列表

时间:2016-10-23 21:01:46

标签: elixir

Elixir提供了一些is_函数,可以让您检查项目是否是特定类型:

  • is_atom
  • is_binary
  • is_map

但是如何检查一个值是否是Elixir中的关键字列表?我知道在下面,关键字列表是一个包含第一个元素作为原子的2元素元组的列表,所以我的目前的解决方法是:

defmodule KList do
  def is_keyword?(list) when is_list(list) do
    Enum.all? list, fn item ->
      case item do
        {k, _} -> is_atom(k)
        _      -> false
      end
    end
  end

  def is_keyword?(_), do: false
end

有更好的(或内置的)方式吗?更重要的是,我如何在when条款中执行此操作?

1 个答案:

答案 0 :(得分:13)

原来内置的解决方案; Keyword模块导出keyword?/1方法:

  

<强> Keyword.keyword?(term)

     

如果true是关键字列表,则返回term;否则返回false

示例:

iex> Keyword.keyword?([])
true
iex> Keyword.keyword?([a: 1]
true
iex> Keyword.keyword?([{Foo, 1}])
true
iex> Keyword.keyword?([{}])
false
iex> Keyword.keyword?([:key])
false
iex> Keyword.keyword?(%{})
false

注意: 与内核中的其他is_导出不同,keyword? 宏 - 这意味着无法使用在守卫。