學習軌道
/
Elixir
Elixir
/
練習
/
廚房計算機
廚房計算機

廚房計算機

學習練習

簡介

元組

在 Elixir 中,元組是一種組織資料的資料結構,可以存放任意型別、固定數量的項目,但每個元素都沒有明確的名稱。在 Elixir 中,元組常用於記憶體讀取密集的操作,因為讀取元素是常數時間的操作。當元素需要動態新增或移除時,通常不會使用元組,因為它不會修改既有的元組,而是建立一個新的元組,這需要事先配置記憶體。

實際上,在 Elixir 中是用大括號建立元組。元組中的元素可以用elem/2函式個別存取,索引從 0 開始:

empty_tuple = {}
one_element_tuple = {1}
multiple_element_tuple = {1, :a, "hello"}

elem(multiple_element_tuple, 2)
# => "hello"

以元組表示群組資訊

實際上,元組經常被用來表示群組化的資訊。

Float.ratio(0.25)
# => {1, 4} indicating the numerator and denominator of the fraction ¼

模式比對

在斷言式、慣用的 Elixir 程式碼中,模式比對的使用非常普遍。你可能還記得,=/2被描述為比對運算子,而不是指定運算子。使用比對運算子時,如果左側的模式與右側相符,左側的任何變數都會被綁定,並回傳右側的值。如果沒有比對成功,就會引發MatchError。

2 = 2
# => 2
# Literals can be matched if they are the same

2 = 3
# => ** (MatchError) no match of right hand side value: 3

{_, denominator} = Float.ratio(0.25)
# => {1, 4}
# the variable `denominator` is bound to the value 4

記住,比對是從右側往左側進行。

在上一個範例中,如果模式比對裡不需要某個變數,我們可以用_來捨棄它。任何以_開頭的變數都不會被執行環境追蹤。

具名函式中的模式比對

在建立多個函式子句時,模式比對也是很有用的工具。模式比對可以用在函式的引數上,藉此決定要呼叫哪個函式子句,從檔案最上方開始往下,直到第一個比對成功為止。變數可以在函式標頭中綁定,並在函式主體中使用。

defmodule Example do
  def named_function(:a = variable_a) do
    {variable_a, 1}
  end

  def named_function(:b = variable_b) do
    {variable_b, 2}
  end
end

Example.named_function(:a)
# => {:a, 1}

Example.named_function(:b)
# => {:b, 2}

Example.named_function(:c)
# => ** (FunctionClauseError) no function clause matching in Example.named_function/1

說明

當你準備為朋友烤餅乾時,發現食譜裡有些計量單位得先換算過。你只熟悉公制,所以需要想個辦法,把常見的美式烘焙計量換算成毫升(mL),讓自己方便一些。

請用這張換算表來解題:

要換算的單位 體積 以毫升(mL)計
毫升 1 1
美制杯 1 240
美制液量盎司 1 30
美制茶匙 1 5
美制湯匙 1 15

身為一位正在學習、才華洋溢的程式設計師,你決定用毫升當作轉換的中介單位,方便把表上任何一種單位換算成其他任何一種(甚至換算成自己)。

1. 從體積配對中取得數值部分

實作KitchenCalculator.get_volume/1函式。給定一個體積配對元組,它應該只回傳其中的數值部分。

KitchenCalculator.get_volume({:cup, 2.0})
# => 2.0

2. 將體積配對換算成毫升

實作KitchenCalculator.to_milliliter/1函式。給定一個體積配對元組,它應該依照換算表把體積換算成毫升。

請使用多重函式子句和模式配對,為每個單位建立對應的函式。用來表示各單位的 atom 有::cup、:fluid_ounce、:teaspoon、:tablespoon、:milliliter。把換算結果包在元組裡回傳。

KitchenCalculator.to_milliliter({:cup, 2.5})
# => {:milliliter, 600.0}

3. 把毫升體積配對換算成其他單位

實作KitchenCalculator.from_milliliter/2函式。給定一個體積配對元組和想要的單位,它應該依照換算表把體積換算成該單位。

請使用多重函式子句和模式配對,為每個單位建立對應的函式。用來表示各單位的 atom 有::cup、:fluid_ounce、:teaspoon、:tablespoon、:milliliter

KitchenCalculator.from_milliliter({:milliliter, 1320.0}, :cup)
# => {:cup, 5.5}

4. 從任何單位換算成任何單位

實作KitchenCalculator.convert/2函式。給定一個體積配對元組和想要的單位,它應該把指定的體積換算成該單位。

KitchenCalculator.convert({:teaspoon, 9.0}, :tablespoon)
# => {:tablespoon, 3.0}
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Elixir Exercism

準備好開始 廚房計算機 了嗎?

註冊 Exercism,透過 58 個概念168 個練習 和真人引導來學習並精通 Elixir,全部免費。