Elixir 地图检查是否不为空且密钥存在

Elixir map check if not empty and key exists

我正在尝试找出一种方法来检查 Phoenix 应用程序(使用 Elixir)中的参数散列是否具有特定密钥。

在模型的以下变更集函数中,参数默认为:empty。

def changeset(model, params \ :empty) do

我需要弄清楚哈希中是否存在名为 :username 的键。

只是一个小术语,params 是映射而不是散列。这与知道在何处查看文档有关。

对于地图有 has_key?/2 其中 returns truefalse.

Map.has_key?(params, :name)

既然您使用的是 Ecto 变更集,那么您也可以使用 Ecto.Changeset.get_change/3

get_change(changeset, key, default \ nil)

此returns default 如果key 未设置。请注意,如果 key 设置为 nil,则 nil 仍将返回。如果 nil 是允许的更改值,那么您可能需要设置不同的默认参数。

Gazeler 的回答显然非常好。我只会在混合中添加模式匹配,在我看来,这是最清晰的解决方案,它不仅适用于 phoenix,而且适用于 Elixir 中任何地方的任何地图。

# head-only declaration for default params
def changeset(model, params \ :empty)

def changeset(model, %{"username" => _} = params) do
  # username field is in params
end

def changeset(model, params) do
  # username is not in params
end