在Elixir中是否有任何方式在传递给函数的nil参数上进行模式匹配?

时间:2016-11-20 23:38:30

标签: elixir

有没有办法在作为参数传递给函数的映射中的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

1 个答案:

答案 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