在 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 |
身為一位正在學習、才華洋溢的程式設計師,你決定用毫升當作轉換的中介單位,方便把表上任何一種單位換算成其他任何一種(甚至換算成自己)。
實作KitchenCalculator.get_volume/1函式。給定一個體積配對元組,它應該只回傳其中的數值部分。
KitchenCalculator.get_volume({:cup, 2.0})
# => 2.0
實作KitchenCalculator.to_milliliter/1函式。給定一個體積配對元組,它應該依照換算表把體積換算成毫升。
請使用多重函式子句和模式配對,為每個單位建立對應的函式。用來表示各單位的 atom 有::cup、:fluid_ounce、:teaspoon、:tablespoon、:milliliter。把換算結果包在元組裡回傳。
KitchenCalculator.to_milliliter({:cup, 2.5})
# => {:milliliter, 600.0}
實作KitchenCalculator.from_milliliter/2函式。給定一個體積配對元組和想要的單位,它應該依照換算表把體積換算成該單位。
請使用多重函式子句和模式配對,為每個單位建立對應的函式。用來表示各單位的 atom 有::cup、:fluid_ounce、:teaspoon、:tablespoon、:milliliter
KitchenCalculator.from_milliliter({:milliliter, 1320.0}, :cup)
# => {:cup, 5.5}
實作KitchenCalculator.convert/2函式。給定一個體積配對元組和想要的單位,它應該把指定的體積換算成該單位。
KitchenCalculator.convert({:teaspoon, 9.0}, :tablespoon)
# => {:tablespoon, 3.0}