模式匹配和默认参数

时间:2016-08-08 02:00:02

标签: elixir

我是Elixir的新手。我有这段代码:

defmodule DefaultParams do
  def func(p1, p2 \\ 2, p3 \\ 3, p4) do
    IO.inspect [p1, p2, p3, p4]
  end
end

使用此代码,我会:

DefaultParams.func("a", "b") #=> ("a", 2, 3, "b")

我理解为什么它会这样运作:因为模式匹配。 Elixir尝试将提供的参数与函数定义中定义的参数进行匹配。

但是,我不明白这一点:

DefaultParams.func("a", "b", "c") #=> ("a", "b", 3, "c")

为什么输出不是("a", 2, "b", "c")?这也适合参数中定义的模式。我在文档中寻找了一个深入的解释,却找不到任何东西。

在考虑了一段时间后,我开始怀疑它是这样的:

  1. “a”与p1
  2. 匹配
  3. “b”与p2
  4. 匹配
  5. “c”与p3不匹配,因为那时会出现不匹配。所以它被跳过了,p3得到了默认值,即3
  6. “c”与p4
  7. 匹配

    有人可以确认/解释吗?

    编辑:修正拼写错误

2 个答案:

答案 0 :(得分:6)

使用您的示例:

def func(p1, p2 \\ 2, p3 \\ 3, p4) do
  IO.inspect [p1, p2, p3, p4]
end

如果您编译代码并使用h DefaultParams.func键入tab,它会显示

iex> h DefaultParams.func
func/2    func/3    func/4

它实际上为您创建了3个功能。

def func(p1, p4),     do: func(p1, 2,  3, p4)
def func(p1, p2, p4), do: func(p1, p2, 3, p4)
def func(p1, p2, p3, p4) do
  IO.inspect [p1, p2, p3, p4]
end      
iex> func(:a, :b)         # calling func/2, which is actually func(p1, 2, 3, p4)
[:a, 2, 3, :b]

iex> func(:a, :b, :c)     # calling func/3, which is actually func(p1, p2, 3, p4) 
[:a, :b, 3, :c]

iex> func(:a, :b, :c, :d) # calling func/4
[:a, :b, :c, :d]

答案 1 :(得分:2)

无法找到它的好参考,但我的理解是尝试从左到右匹配。所以a和b匹配,p3与c匹配,因为p4没有值,所以下一个选项是p4 with c

相关问题