Ruby 开发(三) - Ruby 中的 String、Hash、Array 对象(上)

220 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第7天,点击查看活动详情

一、String 字符串对象的相关操作

Ruby 中字符串是 String 类的实例/对象,String 类有很多的方法可以调用。关于 String 类能够调用的方法,可以从源码中看到

image.png

字符串的创建

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 的大小就返回,剩余的字符无须再比较。