學習軌道
/
Crystal
Crystal
/
練習
/
Luton 圖書館
Luton 圖書館

Luton 圖書館

學習練習

簡介

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 之間轉換

由於 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)

說明

盧頓圖書館是一間大型圖書館,收藏了大量文學作品,範圍從書籍到藝術品都有。 圖書館設有一個部門,專門研究文學並將書籍登錄到電腦系統中。

其中某些部分希望自動化,因此請你來協助他們。 這包括從將登錄流程表單自動化,到協助解密文本等各種工作。

1. 取得標題的第一個字母

圖書館的書籍應該要容易找到,因此它們依標題的第一個字母排序。

實作Library.first_letter方法,它接受一個引數title,其中存放書籍的標題。 這個方法應該回傳標題的第一個字母。

Library.first_letter("Mystery of the Crystal Skull")
# => 'M'

2. 取得作者姓名的首字母

圖書館有許多由不同作者撰寫的書。 作者經常以姓名首字母來稱呼,因此圖書館要求一套系統,只要輸入作者的名字和姓氏,就能取得作者的首字母。 首字母的格式應該如下:{first_letter_of_first_name}.{first_letter_of_last_name}

實作Library.initials方法,它接受兩個引數first_name和last_name,分別存放作者的名字和姓氏。 這個方法應該回傳作者姓名首字母。

Library.initials("William", "Shakespeare")
# => "W.S"

3. 解密字母

有些文學作品經過加密,而圖書館有大量加密文本。 圖書館想要一套新的特殊加密解密系統。

這種加密的做法是取一個字母,並用字母表中它前面的字母取代它。 例如a變成z,b變成a,c變成b,依此類推。

圖書館希望它能解密大寫和小寫字母,並保留與原字母相同的大小寫。

實作Library.decrypt_character方法,它接受一個引數character,其中存放要解密的字母。 這個方法應該回傳解密後的字母。

Library.decrypt_character('a')
# => 'z'

4. 解密文本

圖書館也想解密整段文本,同樣採用取字母表中前一個字母的加密方式。

解密程式應該只解密字母,其他字元都保持原樣。

實作Library.decrypt_text方法,它接受一個引數text,其中存放要解密的文本。 這個方法應該回傳解密後的文本。

Library.decrypt_text("Ifmmp Xpsme!")
# => "Hello World!"
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Crystal Exercism

準備好開始 Luton 圖書館 了嗎?

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