iT邦幫忙

DAY 27
1

蠻可愛的 Erlang 與 Elixir系列 第 27

Elixir 的 Control flow

Elixir的Control Flow有四種,分別為Pattern match,
Multi-clause functions, Conditional statments
以及Loops.

先來看看老朋友Pattern match吧.

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

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

Conditional statments

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.


上一篇
Elixir 的 range, keyword list
下一篇
Elixir 的 Loops 與 iteration
系列文
蠻可愛的 Erlang 與 Elixir30

尚未有邦友留言

立即登入留言