iT邦幫忙

2025 iThome 鐵人賽

DAY 6
0

arity (元數)

其實就是函式的參數數量

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

在文件上都會這樣標記
https://ithelp.ithome.com.tw/upload/images/20250920/20141054k08OKatXD9.png

預設參數

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 可以


上一篇
函式 1
下一篇
匿名函式
系列文
通勤看手機就可讀懂的 Elixir 語言入門教學10
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言