我是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")?这也适合参数中定义的模式.我在文档中寻找了一个深入的解释但却找不到任何东西.
在考虑了一段时间之后,我开始怀疑它的工作原理如下:
有人可以确认/解释吗?
编辑:修正错别字
要使用您的示例:
def func(p1, p2 \\ 2, p3 \\ 3, p4) do
IO.inspect [p1, p2, p3, p4]
end
Run Code Online (Sandbox Code Playgroud)
如果您编译代码,并输入h DefaultParams.func用tab,它会告诉你
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)
| 归档时间: |
|
| 查看次数: |
910 次 |
| 最近记录: |