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中取出一个字符,可以使用你熟悉的方括号表示法。
[]是作为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"
从前,有一位古怪的程序员,住在一栋窗户装着铁栅栏的奇怪房子里。有一天,他从一个在线招聘网站上接了一份工作,要造一个派对机器人。这个机器人负责迎接客人,并把他们带到座位上。第一版非常技术化,暴露出这位程序员缺乏与人打交道的经验。其中一些问题也被带进了下一版。
实现welcome方法,用给定的名字返回一条欢迎消息:
PartyRobot.welcome("Christiane")
# => Welcome to my party, Christiane!
实现happy_birthday方法,用这个人的名字和年龄返回一条生日祝福。可惜这位程序员有点爱炫耀,所以机器人必须展示它知道每位客人的生日。
PartyRobot.happy_birthday("Frank", 58)
# => Happy birthday Frank! You are now 58 years old!
实现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.