轨道
/
Crystal
Crystal
/
练习
/
卢顿图书馆
卢顿图书馆

卢顿图书馆

学习练习

简介

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 之间转换

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

说明

卢顿图书馆是一座大型图书馆,馆藏文献十分丰富,从书籍到艺术作品应有尽有。图书馆设有一个区域,供人们研究文献并把书籍录入计算机系统。

其中某些环节希望能实现自动化,于是图书馆请你来帮忙。这包括把题写流程的表单自动化,以及协助解密文本。

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

准备好开始 卢顿图书馆 了吗?

注册 Exercism,借助 26 个概念142 个练习 和真人导师指导,学习并掌握 Crystal,全部免费。