Elixir的Control Flow有四種,分別為Pattern match,
Multi-clause functions, Conditional statments
以及Loops.
先來看看老朋友Pattern match吧.
前面在Erlang的介紹中,Pattern match已經廣泛使用,
所以在此就不多解釋,過程也不逐步解釋.
直接來看範例:
iex(1)> {name, age} = {"Miku", 24}
{"Miku", 24}
iex(2)> name
"Miku"
iex(3)> age
24
呼叫Erlang function calendar.local_time/0
以取得現在時刻.
iex(1)> {date, time} = :calendar.local_time
{{2014, 10, 27}, {18, 15, 41}}
iex(2)> {year, month, day} = date
{2014, 10, 27}
iex(3)> {hour, minute, second} = time
{18, 15, 41}
Multi-clause functions,在前面的例子中,
函數與模式比對,已經有介紹過.
今天介紹Guard部份,這與Erlang的Guard是一樣的.
直接來看範例:
defmodule TestNum do
def test(x) when is_number(x) and x < 0 do
:negative
end
def test(0) do
:zero
end
def test(x) when is_number(x) and x > 0 do
:positive
end
def test(_) do
:bad_input
end
end
編譯及測試
iex(1)> c "test_num.ex"
[TestNum]
iex(2)> TestNum.test("xyz")
:bad_input
iex(3)> TestNum.test(:xyz)
:bad_input
iex(4)> TestNum.test(1)
:positive
iex(5)> TestNum.test(0)
:zero
iex(6)> TestNum.test(-1)
:negative
iex(7)> g = 2
2
iex(8)> TestNum.test(g)
:positive
Elixir除了前面pattern match及Multi-clause functions,
還提供了if else等語法.
先來看 if 跟 unless
一個max(a,b)函數,可以寫成
def max(a, b) do
if a >= b, do: a, else: b
end
或是
def max(a, b) do
unless a >= b, do: b, else: a
end
再來看 cond.
模式如
cond do
expression_1 ->
...
expression_2 ->
...
...
end
會執行第一個符合的expression,而且最少要有一個符合的.
上面的max(a,b) 用cond的方式,可以這樣寫
def max(a, b) do
cond do
a >= b -> a
true -> b
end
最後介紹case
上面的max(a,b) 用case的方式,可以這樣寫
def max(a, b) do
case a >= b do
true -> a
false -> b
end
end
今天先介紹到此,明天介紹Loops.