Fork me on GitHub

Riadiace štruktúry

In this lesson we will look at the control structures available to us in Elixir.
V tejto lekcii sa pozrieme na riadiace štruktúry jazyka Elixir.

Obsah

if a unless

Na funkciu if ste už pravdepodobne narazili a ak ste pracovali s Ruby, poznáte aj unless. V Elixire fungujú úplne rovnako, no sú implementované ako makrá, nie sú to skutočné jazykové konštrukty. Ich implementáciu si môžete pozrieť v dokumentácii modulu Kernel.

Len pre pripomenutie: je dôležité si uvedomiť, že jediné hodnoty, ktoré Elixir vyhodnotí ako false (v angličtine sa používa výraz falsey), sú hodnoty nil a false. Všetko ostatné sa vyhodnotí ako true (truthy).

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

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

Použitie unless je analogické k if - pracuje opačne, t.j. ako if not:

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

case

Ak potrebujeme hodnotu porovnať s viacerými možnosťami (vzormi), môžeme použiť case:

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

Špeciálna premenná _ má v case význam žolíka, teda matchne čokoľvek. Používa sa podobne, ako else alebo default vetva v iných jazykoch. Bez nej nám case vyhodí chybu, ak sa mu nepodarí matchnúť hodnotu do niektorej zo svojich vetiev:

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

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

Keďže výraz case je založený na pattern matchingu, platia preň všetky jeho pravidlá a obmedzenia. Ak chceme matchovať oproti existujúcim premenným (t.j. nepriraďovať do nich), musíme použiť operátor 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"

Výborná vec, ktorú nám case umožňuje použiť, sú tzv. guard clauses (hraničné podmienky):

Nasledujúci príklad pochádza priamo z oficiálnej príručky Elixiru Getting Started.

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

Pozrite si príslušnú kapitolu v oficiálnej dokumentácii Expressions allowed in guard clauses.

cond

Keď potrebujeme vetviť na základe podmienok, nie hodnôt, použijeme cond - funguje to podobne ako séria else if v iných jazykoch:

Nasledujúci príklad pochádza priamo z oficiálnej príručky Elixiru Getting Started.

iex> cond do
...>   2 + 2 == 5 ->
...>     "Do tejto vetvy sa nedostaneme"
...>   2 * 2 == 3 ->
...>     "Ani do tejto"
...>   1 + 1 == 2 ->
...>     "No do tejto áno"
...> end
"No do tejto áno"

Podobne ako case aj cond vyhodí chybu, ak nenájde použiteľnú vetvu. V tom prípade musíme vytvoriť vetvu s podmienkou true, ktorá takéto prípady odchytí:

iex> cond do
...>   7 + 1 == 0 -> "Incorrect"
...>   true -> "Catch all"
...> end
"Catch all"

Zdieľaj túto stránku