我是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")
?这也适合参数中定义的模式。我在文档中寻找了一个深入的解释,却找不到任何东西。
在考虑了一段时间后,我开始怀疑它是这样的:
有人可以确认/解释吗?
编辑:修正拼写错误
答案 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