陣列是 Elixir 語言內建的資料結構。它們被視為一種基本型別,以方括號表示。陣列可以是空的,也可以存放任意數量的項目,項目可以是任何型別。例如:
empty_list = []
one_item_list = [1]
two_item_list = [1, 2]
multiple_type_list = [1, :pi, 3.14, "four"]
Elixir 將陣列實作成連結陣列,其中每個節點儲存 2 個值:第一個項目,以及包含其餘所有項目的另一個陣列。陣列中的第一個項目稱為_頭_,其餘項目組成的陣列則稱為_尾_。我們可以在程式碼中使用這種表示法:
# [1] represented in [head | tail] notation
[1 | []]
# [1, 2, 3] represented in [head | tail] notation
[1 | [2 | [3 | []]]]
我們可以使用 [head | tail] 表示法將元素加到陣列的前面:
# Suppose
list = [2, 1]
[3, 2, 1] == [3 | list]
# => true
Kernel模組中有幾個處理陣列的函式,另外還有完整的List模組。
# Check if 1 is a member of the list
1 in [1, 2, 3, 4]
# => true
在這個練習中,你需要實作一些函式,來操作程式語言的陣列。
定義new/0函式,它不接受任何引數,並回傳一個空陣列。
LanguageList.new()
# => []
定義add/2函式,它接受 2 個引數(一個_語言陣列_,以及一個代表_語言_的字串常值)。它應該回傳把新語言加在給定陣列最前面所得到的陣列。
language_list = LanguageList.new()
# => []
language_list = LanguageList.add(language_list, "Clojure")
# => ["Clojure"]
language_list = LanguageList.add(language_list, "Haskell")
# => ["Haskell", "Clojure"]
定義remove/1函式,它接受 1 個引數(一個_語言陣列_)。它應該回傳移除第一個項目後的陣列。假設陣列永遠至少會有一個項目。
language_list = LanguageList.new()
# => []
language_list = LanguageList.add(language_list, "Clojure")
# => ["Clojure"]
language_list = LanguageList.add(language_list, "Haskell")
# => ["Haskell", "Clojure"]
language_list = LanguageList.remove(language_list)
# => ["Clojure"]
定義first/1函式,它接受 1 個引數(一個_語言陣列_)。它應該回傳陣列中的第一個語言。假設陣列永遠至少會有一個項目。
language_list = LanguageList.new()
# => []
language_list = LanguageList.add(language_list, "Elm")
# => ["Elm"]
language_list = LanguageList.add(language_list, "Prolog")
# => ["Prolog", "Elm"]
LanguageList.first(language_list)
# => "Prolog"
定義count/1函式,它接受 1 個引數(一個_語言陣列_)。它應該回傳陣列中的語言數量。
language_list = LanguageList.new()
# => []
language_list = LanguageList.add(language_list, "Elm")
# => ["Elm"]
language_list = LanguageList.add(language_list, "Prolog")
# => ["Prolog", "Elm"]
LanguageList.count(language_list)
# => 2
定義functional_list?/1函式,它接受 1 個引數(一個_語言陣列_)。它應該回傳一個布林值。如果_"Elixir"_是陣列中的其中一個語言,它應該回傳 true。
language_list = LanguageList.new()
# => []
language_list = LanguageList.add(language_list, "Elixir")
# => ["Elixir"]
LanguageList.functional_list?(language_list)
# => true