持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第7天,点击查看活动详情
一、String 字符串对象的相关操作
Ruby 中字符串是 String 类的实例/对象,String 类有很多的方法可以调用。关于 String 类能够调用的方法,可以从源码中看到
字符串的创建
Ruby 中允许使用单引号和双引号来创建字符串,但是这两种方式稍有区别;使用单引号创建的字符串只能进行最少替换,使用双引号创建的字符串则能进行更多的替换,比如转义字符和其他特殊字符
alpha = 'Hello\nRuby\s'
bravo = "Hello\nRuby\s,"
puts alpha
puts bravo
上述代码执行结果如下:
Hello\nRuby\s
Hello
Ruby ,
单引号创建的字符串中 \n
换行和 \t
空格都没有进行转义,而双引号创建的字符串中被转移了。
Ruby 中的转义字符和特殊字符
字符串 | 含义 |
---|---|
\a | 报警符 |
\nnn | 八进制表示法,其中 n 的范围为 0~7 |
\xnn | 十六进制表示法,其中 n 的范围为 0.9、 a.f 或 A.F |
\b | 退格键 |
\cx | Control-x |
\C-x | Control-x |
\e | 转义符 |
\f | 换页符 |
\M-\C-x | Meta-Control-x |
\n | 换行符 |
\r | 回车符 |
\s | 空格符 |
\t | 制表符 |
\v | 垂直制表符 |
\x | 字符 x |
Ruby 中提供了两个内置类 String 和 Symbol,这两个类都提供了文本功能,通过这两个类中的方法可以操作字符串。
合并字符串
在合并两个字符串时可以会返回一个新的字符串,原字符串不变,也可以改变原字符串。要创建一个由两个或者两个以上的字符串组成的新字符串可以使用 +
操作符将多个字符串合并
charlie = "Hello"
delta = " Ruby"
echo = "!"
foxtrot = charlie + delta + echo
puts foxtrot
执行上述代码,输出结果如下:
Hello Ruby!
使用 +
操作符合并字符串时,原字符串保持不变,回生成一个新的字符串,除了 +
之前还可以使用 *
乘以具体的整数,表示将字符串复制整数倍,使用 *
也是返回一个新的字符串
puts charlie * 5
HelloHelloHelloHelloHello
使用 <<
为已有的字符串变量永久性的增加另一个字符串
charlie = "Hello"
delta = " Ruby"
echo = "!"
charlie = charlie << delta << echo
puts charlie
puts delta
puts echo
执行上述代码,输出结果如下:
Hello Ruby!
Ruby
!
使用 <<
操作符之后,变量的值会被改变
还可以使用 #{变量名}
的方式获取变量的值,然后进行拼接合并
charlie = "Hello"
delta = " Ruby"
echo = "!"
puts "#{charlie}#{delta}#{echo}"
执行上述代码,输出结果如下:
Hello Ruby!
替换字符串
使用 Ruby String 类的 replace 方法可以替换字符串中的内容
golf = "HELLO Ruby!"
golf.replace("Hello Ruby!")
puts golf
执行上述代码,输出结果如下:
Hello Ruby!
字符串调用 replace 方法会修改原字符串。
复制字符串
复制字符串可以使用 dup 方法或者 clone 方法,其中 dup 方法只是复制字符串的内容,而 clone 方法除了复制字符串的内容外同时也集成了特殊方法、污染(taint)、冻结(freeze)等信息,一般来说使用 dup 方法来复制字符串就已经足够了。
hotel = "Rails"
puts hotel.dup
puts hotel.clone
执行上述代码,输出结果如下:
Rails
Rails
改变字符串
Ruby 内置类中还提供了改变字符串的方法,通过使用这些方法可以改变字符串大小写、删除字符和去除首位空格等
方法 | 作用 | |||
---|---|---|---|---|
capitalize | 把字符串转换为大写字母显示 | |||
upcase | 返回 str 的副本,所有的小写字母会被替换为大写字母。操作是环境不敏感的,只有字符 a 到 z 会受影响。 | |||
downcase | 返回 str 的副本,所有的大写字母会被替换为小写字母。 | |||
swapcase | 返回 str 的副本,所有的大写字母转换为小写字母,所有的小写字母转换为大写字母。 | |||
strip | 返回 str 的副本,移除了前导的空格和尾随的空格。 | |||
length | 返回 str 的长度。把它与 size 进行比较。 | ljust(integer, padstr=' ') | 如果 integer 大于 str 的长度,则返回长度为 integer 的新字符串,新字符串以 str 左对齐,并以 padstr 作为填充。否则,返回 str。 | |
lstrip | 返回 str 的副本,移除了前导的空格。 | |||
empty | 如果 str 为空(即长度为 0),则返回 true。 | |||
reverse | 返回一个新字符串,新字符串是 str 的倒序。 | |||
str.rstrip | 返回 str 的副本,移除了尾随的空格。 | |||
casecmp | 不区分大小写的字符串比较。 | center | 居中字符串。 | |
chomp | 从字符串末尾移除记录分隔符($/),通常是 \n。如果没有记录分隔符,则不进行任何操作。 | |||
str.chop | 移除 str 中的最后一个字符。 | |||
concat(other_str) | 连接 other_str 到 str。 |
字符串切片
Ruby 中可以使用 []
获取字符串中的字符或者字符串,其中的参数为索引
golf = "ABCDEFGHIJK"
puts golf[1,2]
puts golf[3].ord
puts golf[3]
puts golf[0,11]
puts golf[-1]
执行上述代码,输出结果如下:
BC
68
D
ABCDEFGHIJK
K
当索引为整数时,表示从左边开始计数,并且索引是从 0 开始的,当索引为负数时,表示从右边往左开始计数,索引从 -1 开始。ord 函数可以返回字符串的 ASCII 码。
比较字符串
比较两个字符串的内容是否相等可以使用 ==
操作符,返回结果为 true 或者 false。
lima = "hello"
mike = "hello"
puts lima == mike
true
使用 <=>
操作符比较两个字符串时,比较的是字符串的 ASCII 码的大小,返回值为 -1、0、1。>
、<
、=
也可以对字符串进行比较 ASCII 码的操作,返回结果为 true 或者 false
puts "a".ord
puts "b".ord
puts "a" <=> "b"
puts "b" <=> "a"
puts "a" <=> "a"
puts "a" > "b"
执行上述代码,输出结果如下:
97
98
-1
1
0
false
使用 <=>
比较时,当左边小于右边时返回 -1, 两边相等时返回 0,左边大于右边时返回 1。
lima = "hella"
mike = "hellb"
puts lima <=> mike
lima = "add"
mike = "ba"
puts lima <=> mike
执行上述代码,输出结果如下:
-1
-1
当比较字符串时,会逐个比较两个字符串相同索引位置的字符,从左边开始比较,一旦比较出 ASCII 的大小就返回,剩余的字符无须再比较。