Elixir 裡允許也常常使用兩個或以上的同名但是不同 arity 的函式組合
defmodule Greet do
def hello(name), do: name
def hello(first, last), do: "#{first} #{last}"
def hello(first, middle, last), do: "#{first} #{middle} #{last}"
end
與上一篇的 function clause 不同的是,function clause 是為同個函式,
但這三個對 Elixir 來說是不同函式,
為了可以明確的指定函式,Elixir 使用 /
來指定 arity 數量
這三個函式分別為
Greet.hello/1
Greet.hello/2
Greet.hello/3
在文件上都會這樣標記
defmodule Greeter do
# 替 greeting 加上預設的 "Hello"
def greet(name, greeting \\ "Hello") do
"#{greeting}, #{name}!"
end
end
Greeter.greet("Alice")
#=> "Hello, Alice!"
Greeter.greet("Bob", "Hi")
#=> "Hi, Bob!"
Greeter.greet("Charlie", "Hey")
#=> "Hey, Charlie!"
要注意的是,預設參數後面不能有普通的必需參數
def bad_func(a, b \\ 2, c), do: a + b + c
** (ArgumentError) cannot invoke def/2 outside module
使用預設參數在編譯時,會被展開成不同 arity 的函式
defmodule Example do
def greet(name, greeting \\ "Hello") do
"#{greeting}, #{name}!"
end
end
被視為
def greet(name) do
greet(name, "Hello")
end
def greet(name, greeting) do
"#{greeting}, #{name}!"
end
因此在預設參數與同名函式一起的時候要避免衝突
像是這個 Example.greet 便不能再加一個 arity 1 的函式
但是 arity 3 可以