轨道
/
Crystal
Crystal
/
练习
/
派对机器人
派对机器人

派对机器人

学习练习

简介

Crystal 有一种叫做String的类型,用来表示文本。Crystal 的字符串是 Unicode 字符的序列。字符串是不可变的,一旦创建就无法更改。也就是说,每次修改字符串都会创建一个新的字符串,原字符串本身不会被改动。

要定义字符串,使用双引号 "。

"Hello World"

拼接

要拼接两个字符串,使用+运算符。+运算符会返回一个把两个字符串合在一起的新字符串。

hello = "Hello"
hello + " World"
# => "Hello World"

字符串与数字之间的转换

to_i方法能把字符串转换成整数。也可以用to_f方法返回一个浮点数。如果字符串无法转换成数字,就会抛出ArgumentError。

"1".to_i
# => 1

"1.0".to_f
# => 1.0

"Hello".to_i
# => ArgumentError: Invalid integer: Hello

整数或浮点数可以用to_s方法转换成字符串。

1.to_s
# => "1"

1.0.to_s
# => "1.0"

插值

插值是一种把字符串拼接起来、并在字符串中嵌入表达式的便捷方式。要进行插值,可以使用#字符,后面跟上花括号{},把表达式写进花括号里。

name = "World"
"Hello #{name}!"
# => "Hello World!"

Crystal 会自动把表达式的结果转换成字符串。

"Hello #{1 + 1}!"
# => "Hello 2!"

大小

当你想知道一个字符串里有多少个字符时,可以使用size方法,它会以整数的形式返回字符串的长度。字符串的大小是字符串自身存储的一个属性,所以每次调用该方法时不必重新计算,速度非常快。

"Hello World".size
# => 11

下标

下标用于从字符串中取出某个特定的字符。要从String中取出一个字符,可以使用你熟悉的方括号表示法。

Note

[]是作为String的实例方法实现的,其中的下标就是该方法的实参。

字符串的第一个字符位于下标 0。

"Hello World"[0]
# => 'H'

"Hello World"[6]
# => 'W'

要从字符串末尾取字符,可以用字符串的长度减一来得到最后一个字符的下标,要取倒数第二个字符,就用长度减二,依此类推。这有个捷径,就是直接使用负下标:最后一个字符的下标是 -1,倒数第二个字符的下标是 -2,依此类推。

name = "Hello World"
name[name.size - 1]
# => 'd'

name[-1]
# => 'd'

转义

有些字符不能直接写在字符串里,必须使用转义序列。例如,如果你想在字符串里使用双引号,就得对双引号进行转义。可以用\字符写一个转义序列,后面跟上你想转义的字符。

下面是 Crystal 中的特殊字符:

值 说明
\a 响铃
\b 退格
\e 转义
\f 换页
\n 换行
\r 回车
\t 水平制表符
\v 垂直制表符
\\ 反斜杠
\' 单引号
\" 双引号
\377 八进制 ASCII 字符
\xFF 十六进制 ASCII 字符
\uFFFF 十六进制 Unicode 字符
puts "Hello \"World\""
# => Hello "World"

puts "Hello \nWorld"
# => Hello
# => World

多行字符串

要写多行字符串,语法和单行字符串一样,只是字符串中的每一行都要另起一行。

"Hello
World"
# => "Hello\nWorld"

说明

从前,有一位古怪的程序员,住在一栋窗户装着铁栅栏的奇怪房子里。有一天,他从一个在线招聘网站上接了一份工作,要造一个派对机器人。这个机器人负责迎接客人,并把他们带到座位上。第一版非常技术化,暴露出这位程序员缺乏与人打交道的经验。其中一些问题也被带进了下一版。

1. 欢迎新客人来参加派对

实现welcome方法,用给定的名字返回一条欢迎消息:

PartyRobot.welcome("Christiane")
# => Welcome to my party, Christiane!

2. 欢迎今天过生日的新客人来参加派对

实现happy_birthday方法,用这个人的名字和年龄返回一条生日祝福。可惜这位程序员有点爱炫耀,所以机器人必须展示它知道每位客人的生日。

PartyRobot.happy_birthday("Frank", 58)
# => Happy birthday Frank! You are now 58 years old!

3. 指路

实现assign_table函数来指路。它应该接受 5 个形参。

  • 要迎接的新客人的名字(String)
  • 桌号(Int)
  • 同桌的名字(String)
  • 找到桌子的方向(String)
  • 到桌子的距离(Float64)

确切的结果格式见下面的示例。

同桌的名字应缩写为这个名字的首字母和末字母。Frank 会变成 Fk,Christian 会变成 Cn,依此类推。

机器人会说出桌号。机器人还会提到桌子的距离。幸好精度只保留 1 位小数。

PartyRobot.assign_table("Christiane", "on the left", 27, 23.7834298, "Frank")
# =>
# Welcome to my party, Christiane!
# You have been assigned to table 27. Your table is on the left, exactly 23.8 meters from here.
# You will be sitting next to Fk.
通过 GitHub 编辑 链接将在新窗口或新标签页中打开
Crystal Exercism

准备好开始 派对机器人 了吗?

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