检查值是否为关键字列表

She*_*yar 10 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
Run Code Online (Sandbox Code Playgroud)

有没有更好的(或内置)方式这样做?更重要的是,我怎么能在一个when条款中做到这一点?

She*_*yar 14

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

Keyword.keyword?(项)

返回trueif 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
Run Code Online (Sandbox Code Playgroud)

注意: is_内核中的其他导出不同,keyword?不是宏 - 这意味着它不能用于防护.