前面在介紹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中,反向操作.
這是各自的風格,使用時我們需要融入其風格.