Charlist 是使用~c Sigil 建立的。
~c"hello"
請注意,在舊版 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表達式中的子句會從上到下依序求值,直到找到符合的模式為止。
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 字元,所以無法將它辨識為有效的電子郵件地址。
要大家放棄自己慣用的老舊電子郵件用戶端是徒勞無功的,於是你決定為所有電子郵件帳號建立清理過的別名。
實作sanitize/1函式。它接受以 charlist 表示的使用者名稱,並回傳移除所有非小寫字母後的使用者名稱。
Username.sanitize(~c"schmidt1985")
# => ~c"schmidt"
擴充sanitize/1函式,讓它不會移除使用者名稱中的底線。
Username.sanitize(~c"mark_fischer$$$")
# => ~c"mark_fischer"
德文字母中有 4 個非 ASCII 字元,它們都有大家熟知的 ASCII 替代寫法。
| 德文字元 | ASCII 替代字元 |
|---|---|
| ä | ae |
| ö | oe |
| ü | ue |
| ß | ss |
擴充sanitize/1函式,讓它依照表格替換德文字元。你可以放心假設所有使用者名稱都已經是小寫。
Username.sanitize(~c"cäcilie_weiß")
# => ~c"caecilie_weiss"