Char是 Crystal 中的一種資料型態,代表一個 32 位元的 Unicode 碼位。
它的大小讓它在記憶體使用上很有效率,也賦予它一些字串沒有的特殊屬性。
建立時使用單引號('),且裡面只能放一個 Unicode 碼位。
'a' # => 'a'
'a'.class # => Char
在 Crystal 中處理字串時,經常會用到 Char,因為 String 類別中有不少方法會回傳 Char,或接受 Char 作為引數。
例如,String#[]方法會回傳一個 Char,而String#chars方法則會回傳一組 Char 的集合。
由於 Char 是一個 32 位元的 Unicode 碼位,因此支援遞增與遞減。這表示如果你有'a',只要加一就能得到'b'。
'a' + 5
# => 'f'
'z' - 25
# => 'a'
另外還有Char#succ方法,會回傳 Unicode 表中下一個字元,以及Char#pred方法,會回傳 Unicode 表中前一個字元。
'a'.succ
# => 'b'
'z'.pred
# => 'y'
由於 Char 僅用來代表一個 32 位元的 Unicode 碼位,所以兩個 Char 無法串接在一起。 因此,Char 只能與字串串接。
'a' + "bc"
# => "abc"
'a' + 'b'
# => error: expected argument #1 to 'Char#+' to be Int or String, not Char
Crystal 提供了一些方法來取得字元的相關資訊,例如它是不是數字或字母,或是它屬於大寫還是小寫。 以下是部分方法的清單,完整的清單請參閱 Char API:
| Method | Description |
|---|---|
Char#number? |
若 Char 是數字則回傳 true
|
Char#letter? |
若 Char 是字母則回傳 true
|
Char#lowercase? |
若 Char 是小寫則回傳 true
|
Char#uppercase? |
若 Char 是大寫則回傳 true
|
Char#ascii? |
若 Char 是 ASCII 字元則回傳 true
|
Char#whitespace? |
若 Char 是空白字元則回傳 true
|
由於 Char 代表一個 32 位元的 Unicode 碼位,因此可以在 Char 與碼位(Int)之間互相轉換。
這可以透過Char#ord方法做到,它會回傳該 Char 的碼位;或是使用Int#chr方法,它會回傳該碼位對應的 Char。
'a'.ord
# => 97
97.chr
# => 'a'
與其他資料型態一樣,Char 也有一些可在不同型別之間轉換的方法。
最常用的是Char#to_s方法,會把 Char 轉成字串。不過,還有Char#to_i方法,會把 Char 轉成整數,以及Char#to_f方法,會把 Char 轉成浮點數。
'a'.to_s
# => "a"
'4'.to_i
# => 4
'a'.to_i
# => Error: Invalid integer: a (ArgumentError)
盧頓圖書館是一間大型圖書館,收藏了大量文學作品,範圍從書籍到藝術品都有。 圖書館設有一個部門,專門研究文學並將書籍登錄到電腦系統中。
其中某些部分希望自動化,因此請你來協助他們。 這包括從將登錄流程表單自動化,到協助解密文本等各種工作。
圖書館的書籍應該要容易找到,因此它們依標題的第一個字母排序。
實作Library.first_letter方法,它接受一個引數title,其中存放書籍的標題。
這個方法應該回傳標題的第一個字母。
Library.first_letter("Mystery of the Crystal Skull")
# => 'M'
圖書館有許多由不同作者撰寫的書。
作者經常以姓名首字母來稱呼,因此圖書館要求一套系統,只要輸入作者的名字和姓氏,就能取得作者的首字母。
首字母的格式應該如下:{first_letter_of_first_name}.{first_letter_of_last_name}
實作Library.initials方法,它接受兩個引數first_name和last_name,分別存放作者的名字和姓氏。
這個方法應該回傳作者姓名首字母。
Library.initials("William", "Shakespeare")
# => "W.S"
有些文學作品經過加密,而圖書館有大量加密文本。 圖書館想要一套新的特殊加密解密系統。
這種加密的做法是取一個字母,並用字母表中它前面的字母取代它。
例如a變成z,b變成a,c變成b,依此類推。
圖書館希望它能解密大寫和小寫字母,並保留與原字母相同的大小寫。
實作Library.decrypt_character方法,它接受一個引數character,其中存放要解密的字母。
這個方法應該回傳解密後的字母。
Library.decrypt_character('a')
# => 'z'
圖書館也想解密整段文本,同樣採用取字母表中前一個字母的加密方式。
解密程式應該只解密字母,其他字元都保持原樣。
實作Library.decrypt_text方法,它接受一個引數text,其中存放要解密的文本。
這個方法應該回傳解密後的文本。
Library.decrypt_text("Ifmmp Xpsme!")
# => "Hello World!"