Elixir 默认参数
2023-12-14 17:21 更新
Elixir中的具名函数也支持默认参数:
defmodule Concat do
def join(a, b, sep \\ " ") do
a <> sep <> b
end
end
IO.puts Concat.join("Hello", "world") #=> Hello world
IO.puts Concat.join("Hello", "world", "_") #=> Hello_world
任何表达式都可以作为默认值,但它在函数定义时不会执行;仅仅是存贮备用。每当必须使用默认值的时候,表达式才会被执行:
defmodule DefaultTest do
def dowork(x \\ IO.puts "hello") do
x
end
end
iex> DefaultTest.dowork
hello
:ok
iex> DefaultTest.dowork 123
123
iex> DefaultTest.dowork
hello
:ok
当带默认值的函数有多个从句时,就需要创建一个不包含函数内容的函数头来声明默认值:
defmodule Concat do
def join(a, b \\ nil, sep \\ " ")
def join(a, b, _sep) when is_nil(b) do
a
end
def join(a, b, sep) do
a <> sep <> b
end
end
IO.puts Concat.join("Hello", "world") #=> Hello world
IO.puts Concat.join("Hello", "world", "_") #=> Hello_world
IO.puts Concat.join("Hello") #=> Hello
当使用默认值时,我们要当心函数定义的重叠:
defmodule Concat do
def join(a, b) do
IO.puts "***First join"
a <> b
end
def join(a, b, sep \\ " ") do
IO.puts "***Second join"
a <> sep <> b
end
end
如果我们将上述代码保存到文件“concat.ex”中并编译,Elixir将提出警告:
concat.ex:7: warning: this clause cannot match because a previous clause at line 2 always matches
编译器告诉我们当用两个参数调用join函数时,总会使用第一个join函数定义,而第二个定义只有当传递三个参数时才会被调用:
$ iex concat.exs
iex> Concat.join "Hello", "world"
***First join
"Helloworld"
iex> Concat.join "Hello", "world", "_"
***Second join
"Hello_world"
以上内容是否对您有帮助:
更多建议: