Struktur Kawalan

Dalam pelajaran ini kita akan melihat struktur kawalan yang dibekalkan oleh ELixir.

Table of Contents

if dan unless

Kemungkinan besar anda telah menemui if/2 sebelum ini, dan jika anda pernah menggunakan Ruby anda sudah biasa dengan unless/2. Dalam Elixir mereka berfungsi lebih kurang sama tetapi mereka adalah ditetapkan sebagai makro, bukan komponen asas bahasa itu sendiri; Anda akan menjumpai pelaksanaan mereka dalam Kernel module.

Perlu diingat di dalam Elixir, hanya nil dan boolean false mempunyai nilai false.

iex> if String.valid?("Hello") do
...>   "Valid string!"
...> else
...>   "Invalid string."
...> end
"Valid string!"

iex> if "a string value" do
...>   "Truthy"
...> end
"Truthy"

Penggunaan unless/2 adalah seperti if/2 cuma ia berfungsi secara negatif:

iex> unless is_integer("hello") do
...>   "Not an Int"
...> end
"Not an Int"

case

Jika memerlukan pemadanan dengan pelbagai corak kita boleh gunakan case:

iex> case {:ok, "Hello World"} do
...>   {:ok, result} -> result
...>   {:error} -> "Uh oh!"
...>   _ -> "Catch all"
...> end
"Hello World"

Pembolehubah _ itu adalah penambahan penting di dalam kenyataan case. Jika tidak digunakan, sebarang padanan yang gagal akan menimbulkan ralat:

iex> case :even do
...>   :odd -> "Odd"
...> end
** (CaseClauseError) no case clause matching: :even

iex> case :even do
...>   :odd -> "Odd"
...>   _ -> "Not Odd"
...> end
"Not Odd"

Anggapkan _ sebagai else yang akan dipadankan dengan “yang lain-lain”. Oleh kerana case bergantung kepada pemadanan corak, semua undang-undang dan restriction adalah digunapakai. Jika anda berhasrat untuk membuat padanan kepada pembolehubah sedia ada anda perlu menggunakan operator pin ^:

iex> pie = 3.14
3.14
iex> case "cherry pie" do
...>   ^pie -> "Not so tasty"
...>   pie -> "I bet #{pie} is tasty"
...> end
"I bet cherry pie is tasty"

Satu lagi ciri case ialah sokongan kepada klausa ‘guard’:

Contoh ini diambil terus dari panduan rasmi Elixir Getting Started.

iex> case {1, 2, 3} do
...>   {1, x, 3} when x > 0 ->
...>     "Will match"
...>   _ ->
...>     "Won't match"
...> end
"Will match"

Lihat dokumen rasmi untuk Kenyataan yang dibenarkan di dalam klausa ‘guard’.

cond

Jika kita perlu untuk memadankan keadaan, dan bukan nilai, kita boleh berpaling kepada cond; ini adalah sama dengan else if atau elsif dalam bahasa-bahasa lain:

Contoh ini diambil terus dari panduan rasmi Elixir Getting Started.

iex> cond do
...>   2 + 2 == 5 ->
...>     "This will not be true"
...>   2 * 2 == 3 ->
...>     "Nor this"
...>   1 + 1 == 2 ->
...>     "But this will"
...> end
"But this will"

Seperti juga case, cond akan menimbulkan satu ralat jika tiada padanan. Untuk mengatasi keadaan ini, kita boleh menetapkan satu padanan kepada true:

iex> cond do
...>   7 + 1 == 0 -> "Incorrect"
...>   true -> "Catch all"
...> end
"Catch all"
Caught a mistake or want to contribute to the lesson? Edit this lesson on GitHub!