Char是 Crystal 中的一种数据类型,表示一个 32 位的 Unicode 码点。
它的体积小,因此内存效率很高,也具有 String 所没有的一些特性。
Char使用单引号(')创建,引号内只能放置一个 Unicode 码点。
'a' # => 'a'
'a'.class # => Char
在 Crystal 中处理 String 时,经常需要用到 Char,因为 String 类的不少方法都会返回 Char,或者接受 Char 作为实参。
例如,String#[] 方法返回一个 Char,而 String#chars 方法返回一组 Char。
由于 Char 就是一个 32 位的 Unicode 码点,所以它支持自增和自减。这意味着,如果你有 'a',加上 1 就能得到 'b'。
'a' + 5
# => 'f'
'z' - 25
# => 'a'
还有 Char#succ 方法,它返回 Unicode 表中的下一个字符;以及 Char#pred 方法,它返回 Unicode 表中的上一个字符。
'a'.succ
# => 'b'
'z'.pred
# => 'y'
Char 只用于表示一个 32 位的 Unicode 码点,所以两个字符无法拼接。 因此,Char 只能与 String 拼接。
'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? |
如果该字符是数字,返回 true
|
Char#letter? |
如果该字符是字母,返回 true
|
Char#lowercase? |
如果该字符是小写,返回 true
|
Char#uppercase? |
如果该字符是大写,返回 true
|
Char#ascii? |
如果该字符是 ASCII 字符,返回 true
|
Char#whitespace? |
如果该字符是空白字符,返回 true
|
由于 Char 是 32 位的 Unicode 码点,你可以在 Char 和码点(Int)之间转换。
这可以用 Char#ord 方法完成,它返回该 Char 的码点;也可以用 Int#chr 方法,它返回该码点对应的 Char。
'a'.ord
# => 97
97.chr
# => 'a'
和其他数据类型一样,Char 也有一些用于在类型之间转换的方法。
最常用的是 Char#to_s 方法,它把 Char 转换成 String。此外还有 Char#to_i 方法,把 Char 转换成 Int,以及 Char#to_f 方法,把 Char 转换成 Float。
'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!"