有没有办法在作为参数传递给函数的映射中的nil值上进行模式匹配?
基本上如果下面的代码中的标记为nil,我想模式匹配并调用函数2.如果不编写2个不同命名的函数和case语句,我似乎无法做到这一点。
def my_stuff(%{part: "snippets", possible_nil_token: token}), do: IO.puts "non nil" #function 1
def my_stuff(%{part: "snippets", possible_nil_token: nil}), do: IO.puts "nil" #function 2
答案 0 :(得分:16)
我不确定我是否理解你,但基本上,在Elixir中定义函数的顺序非常重要。
先例是从上到下。这意味着您定义函数的方式始终意味着第一个函数将始终匹配,因为token
的值可以与任何值匹配。
但是,如果您将它们交换并具有nil
检查功能,那么首先会对其进行测试。
E.g。
defmodule Match do
def test(%{part: "snippets", possible_nil_token: nil}), do: IO.puts "nil"
def test(%{part: "snippets", possible_nil_token: token}), do: IO.puts "non-nil"
end
鉴于上面的代码,我可以很容易地将它传递给nil并使其与第一个函数匹配:
iex(1)> Match.test(%{part: "snippets", possible_nil_token: nil})
nil
:ok
iex(2)> Match.test(%{part: "snippets", possible_nil_token: %{val1: "token1"}})
non-nil
:ok