iT邦幫忙

DAY 22
2

蠻可愛的 Erlang 與 Elixir系列 第 22

Elixir的函數以及模式比對

  • 分享至 

  • xImage
  •  

前面在介紹Erlang時,大量使用了模式比對,
在Elixir中,也是一樣.

我們來看以下的模組及函數.

defmodule Rectangle do
  def area(a), do: area(a, a)

  def area(a, b), do: a * b

end

函數的定義方式,與昨天介紹的好像不同.
因為這兩個函數,內容較為簡單,Elixir
提供了較簡便的方式,直接在 do 後面加上 :
一行搞定.省略 end

先編譯及執行:

iex(1)> c "Rectangle.ex"
[Rectangle]
iex(2)> Rectangle.area(5)
25
iex(3)> Rectangle.area(5,6)
30

解釋:

iex(1)> c "Rectangle.ex" 檔名必須與模組名稱相符,我們進行Shell以後,
可以用 c "FileName.ex" 的方式編譯.

iex(2)> Rectangle.area(5) 呼叫模組裡的函數area, 只傳入一個參數,故符合
area/1, 此函數會自行呼叫 area/2, 並將 5 傳入, 變成 area(5,5),最終得到25

iex(3)> Rectangle.area(5,6) 符合 area/2

再來看另一個例子.

defmodule Calc do
  def sum(a) do
    sum(a, 0)
  end

  def sum(a, b) do
    a + b
  end

end

編譯及執行:

iex(4)> c "Calc.ex"
[Calc]
iex(5)> Calc.sum(7)
7
iex(6)> Calc.sum(13, 7)
20

過程相同,在此不贅述.

但是上面的模組,當傳入一個參數時,我們建立單獨的函數sum/1,
來對應此種狀況.
Elixir引進了default value.來看使用default value的方式
改寫的模組.

defmodule Calc2 do
  def sum(a, b \\ 0) do
    a + b
  end

end

編譯及執行:

iex(7)> c "Calc2.ex"
[Calc2]
iex(8)> Calc2.sum(7)
7
iex(9)> Calc2.sum(13, 7)
20

b \\ 0,代表 default value為0,這樣就可以簡化程式碼.

接著介紹 private function

來看下面的模組

defmodule TestPrivate do
  def double(a) do
    sum(a, a)
  end

  defp sum(a, b) do
    a + b
  end
  
end

defp 就是private function,外部無法呼叫.

編譯跟執行過程:

iex(10)> c "TestPrivate.ex"
[TestPrivate]
iex(11)> TestPrivate.double(4)
8
iex(12)> TestPrivate.sum(1,2) 
** (UndefinedFunctionError) undefined function: TestPrivate.sum/2
    TestPrivate.sum(1, 2)

sum/2,外部是無法呼叫的.
在Erlang中,函數要被外部呼叫,需要在 -export([fun1/0...]).
裡宣告.在Elixir中,反向操作.

這是各自的風格,使用時我們需要融入其風格.


上一篇
Elixir: The Power of Erlang, the Joy of Ruby
下一篇
Elixir 關於模組與資料型態
系列文
蠻可愛的 Erlang 與 Elixir30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言