學習軌道
/
Elixir
Elixir
/
練習
/
德國系統管理員
德國系統管理員

德國系統管理員

學習練習

簡介

Charlists

Charlist 是使用~c Sigil 建立的。

~c"hello"
Note

請注意,在舊版 Elixir 中,charlist 是以單引號表示的,例如'hello'。

雖然 charlist 和字串看起來很像,但這兩種資料型態其實大不相同。Charlist 就是由整數組成的陣列。這些整數代表某個字元的 Unicode 值,也就是所謂的碼點。

[65, 66, 67]
# => ~c"ABC"

你可以在字元前面加上?,取得它的碼點。

?A
# => 65

[?:, ?)]
# => ~c":)"

因為 charlist 就是陣列,你可以像操作其他陣列一樣操作它,例如使用遞迴和模式匹配。

[first_letter | _] = ~c"cat"
first_letter
# => 99

你可以使用++串接兩個陣列。

~c"hi" ++ ~c"!"
# => ~c"hi!"

第一個陣列越長,串接的速度就越慢,所以要避免反覆在長度不固定的陣列後面附加元素。

case

case是一種控制流程結構,讓我們可以把某個值與多個模式進行比較。case表達式中的子句會從上到下依序求值,直到找到符合的模式為止。

age = 15

case age do
  0 -> ~c"infant"
  age when age < 4 -> ~c"baby"
  age when age < 13 -> ~c"child"
  age when age < 18 -> ~c"teenager"
  _ -> ~c"adult"
end

# => ~c"teenager"

說明

你在德國慕尼黑的一間大公司擔任系統管理員,其中一項職責就是管理電子郵件帳號。

你一直聽到有人抱怨,說他們沒辦法寄電子郵件給 Müller 先生。你很快發現,公司大多數人使用的一款老舊電子郵件用戶端,因為müller@firma.de裡有非 ASCII 字元,所以無法將它辨識為有效的電子郵件地址。

要大家放棄自己慣用的老舊電子郵件用戶端是徒勞無功的,於是你決定為所有電子郵件帳號建立清理過的別名。

1. 清理現有使用者名稱,移除所有非小寫字母的字元

實作sanitize/1函式。它接受以 charlist 表示的使用者名稱,並回傳移除所有非小寫字母後的使用者名稱。

Username.sanitize(~c"schmidt1985")
# => ~c"schmidt"

2. 允許底線

擴充sanitize/1函式,讓它不會移除使用者名稱中的底線。

Username.sanitize(~c"mark_fischer$$$")
# => ~c"mark_fischer"

3. 替換德文字元

德文字母中有 4 個非 ASCII 字元,它們都有大家熟知的 ASCII 替代寫法。

德文字元 ASCII 替代字元
ä ae
ö oe
ü ue
ß ss

擴充sanitize/1函式,讓它依照表格替換德文字元。你可以放心假設所有使用者名稱都已經是小寫。

Username.sanitize(~c"cäcilie_weiß")
# => ~c"caecilie_weiss"
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Elixir Exercism

準備好開始 德國系統管理員 了嗎?

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