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

标签 elixir

我以这种风格进行了大量的模式匹配:

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/

相关文章:

elixir - 如何获取客户端的IP地址?

elixir - 使用 Phoenix Elixir 渲染指定包含部分

functional-programming - 为什么我不能将匿名函数应用于列表?

elixir - 如何获取Elixir当前的操作系统架构?

erlang - 有没有 Elixir 可以做而 Erlang 做不到的事情,或者反之亦然?

elixir - 在 umbrella 应用程序中运行 mix ecto seeds 文件

elixir - 如何使用 Mix CLI 安装早期版本的 Phoenix?

elixir - 为什么 Supervisor.start_child 不起作用

ssl - 使用 Phoenix/Elixir 和 nginx 在服务器上设置 https

elixir - 如何在 Phoenix 设置默认路线