【问题标题】:Check if a value is a Keyword List检查一个值是否是一个关键字列表
【发布时间】:2019-07-18 10:31:01
【问题描述】:

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 子句中做到这一点?

【问题讨论】:

  • 您将无法检查保护子句中的关键字列表。守卫中允许使用预定义的表达式列表。您可以编写的唯一扩展是扩展为那些允许的表达式的宏。 elixir-lang.org/docs/master/elixir/guards

标签: elixir


【解决方案1】:

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

Keyword.keyword?(term)

如果term 是关键字列表,则返回true;否则返回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? 不是宏 - 这意味着它不能在守卫中使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    • 2014-02-18
    • 2012-10-08
    • 2018-04-12
    • 2021-01-04
    • 2020-02-18
    相关资源
    最近更新 更多