Elixir 映射中相同值键名称的模式匹配的快捷方式

elp*_*dev 5 elixir

我用这种风格做了大量的模式匹配:

def action(%{start_date: start_date, amount: amount, notify: notify %}) do
  # some action
end
Run Code Online (Sandbox Code Playgroud)

大多数情况下,我为参数选择的名称与地图中的名称相同。是否有指定模式匹配案例而不重复键和值的相同名称的快捷方式?

此伪代码行中的某些内容:

def action(%{start_date: %s, amount: %s, notify: %s}) do
  IO.inspect(start_date)
  # some action
end
Run Code Online (Sandbox Code Playgroud)

Ale*_*kin 2

AFAIK,没有什么是开箱即用的,但人们可以简单地为自己创建一个宏来达到这一目的:

\n\n
defmodule M do\n  defmacro struct(params) do\n    {:%{}, [], Enum.map(params, fn e -> {e, {e, [], Elixir}} end)}\n  end\nend\n\ndefmodule Test do\n  require M # to use macro\n  def action(M.struct([:a, :b]) = params),\n    do: IO.inspect params, label: "Params are"\nend\n\nTest.action(%{a: 42, b: :ok})\n#\xe2\x87\x92 Params are: %{a: 42, b: :ok}\nTest.action(%{a: 42})\n** (FunctionClauseError) no function clause matching in Test.action/1\n
Run Code Online (Sandbox Code Playgroud)\n\n

上面的代码当然只是一个 MCVE,您可能需要以某种方式增强它以更优雅地处理极端情况(并且可能拥有更明确的可读宏,其行为比仅仅吐出 AST 更智能,并考虑绑定,等)但我相信这解释了这个想法。

\n