我以这种风格进行了大量的模式匹配:
def action(%{start_date: start_date, amount: amount, notify: notify %}) do
# some action
end
大多数情况下,我为参数选择的名称与 map 中的名称相同。是否有指定模式匹配大小写而不重复键和值的相同名称的快捷方式?
此伪代码行中的某些内容:
def action(%{start_date: %s, amount: %s, notify: %s}) do
IO.inspect(start_date)
# some action
end
最佳答案
AFAIK,没有什么是开箱即用的,但人们可以简单地为自己创建一个宏来达到这个目的:
defmodule M do
defmacro struct(params) do
{:%{}, [], Enum.map(params, fn e -> {e, {e, [], Elixir}} end)}
end
end
defmodule Test do
require M # to use macro
def action(M.struct([:a, :b]) = params),
do: IO.inspect params, label: "Params are"
end
Test.action(%{a: 42, b: :ok})
#⇒ Params are: %{a: 42, b: :ok}
Test.action(%{a: 42})
** (FunctionClauseError) no function clause matching in Test.action/1
上面的代码当然只是一个 MCVE,您可能需要以某种方式对其进行增强以更优雅地处理极端情况(并且可能需要更明确的可读宏,其行为比仅仅吐出 AST 更智能,并考虑绑定(bind),等),但我相信这解释了这个想法。
关于elixir - Elixir 映射中相同值键名称的模式匹配快捷方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44299600/