Elixir 中函数参数中的匹配运算符?

Aad*_*hen 1 elixir

我正在浏览 elixir 项目代码库,遇到以下问题,请帮我看看匹配操作在函数参数中正在做什么?

{ result, errors } = validate(schema, data, "", data)
Run Code Online (Sandbox Code Playgroud)
def validate(root = %{ custom: validator }, data, path, full_data) when is_function(validator) do
  { result, errors } = if Map.has_key?(root, :type), do: validate( Map.drop(root, [:custom]) , data, path ), else: { data, [] }
  case validator.(full_data, result, path) do
    { :ok, value } -> { value, errors }
    { :error, error } -> { result, errors ++ [ %{ param: path, code: :validation_error, message: error  } ]  }
  end
end
Run Code Online (Sandbox Code Playgroud)

Kon*_*kov 5

这是非常惯用的代码,有几个用途:

  1. 它确保root参数是包含键的映射custom(它可能也可能不包含其他键,但我们不关心它们)
  2. 如果是这样,它会就地解构它并将custom的值绑定到validator
  3. 然后它还确保(使用防护)这validator是一个函数

您可以通过函数体内的显式检查来实现相同的目的,但这会更冗长,可能效率较低,而且肯定不太惯用。