模式匹配和默认参数

Ege*_*soz 3 elixir

我是Elixir的新手.我有这个代码:

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

使用此代码,我做:

DefaultParams.func("a", "b") #=> ("a", 2, 3, "b")
Run Code Online (Sandbox Code Playgroud)

我明白为什么它的工作方式如此:因为模式匹配.Elixir尝试将提供的参数与函数定义中定义的参数进行匹配.

但是,我不明白这一点:

DefaultParams.func("a", "b", "c") #=> ("a", "b", 3, "c")
Run Code Online (Sandbox Code Playgroud)

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

在考虑了一段时间之后,我开始怀疑它的工作原理如下:

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

有人可以确认/解释吗?

编辑:修正错别字

sbs*_*sbs 7

要使用您的示例:

def func(p1, p2 \\ 2, p3 \\ 3, p4) do
  IO.inspect [p1, p2, p3, p4]
end
Run Code Online (Sandbox Code Playgroud)

如果您编译代码,并输入h DefaultParams.functab,它会告诉你

iex> h DefaultParams.func
func/2    func/3    func/4
Run Code Online (Sandbox Code Playgroud)

它实际上为您创建了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      
Run Code Online (Sandbox Code Playgroud)
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]
Run Code Online (Sandbox Code Playgroud)