介绍
字符串是可以由字母,数字或符号组成的一个或多个字符的序列。
Ruby中的字符串是对象,与其他语言不同,字符串是可变的 ,这意味着它们可以被改变而不是创建新的字符串。
几乎你写的每个程序都会使用字符串。 字符串可让您使用文本显示和与您的用户沟通。 实际上,您现在阅读的页面是通过网页浏览器显示在屏幕上的字符串组成的。 字符串是编程的最重要的基础之一。
在本教程中,您将学习如何使用Ruby中的字符串。 您将创建字符串,在屏幕上显示它们,将它们存储在变量中,将多个字符串连接在一起,并学习如何处理特殊字符,如换行符,撇号和双引号。
创建和打印字符串
字符串存在于Ruby中的单引号或双引号中,因此要创建一个字符串,请将一系列字符包含在一个或另一个中:
'This is a string in single quotes.'
"This is a string in double quotes."
您可以选择使用单引号或双引号。 在大多数情况下,只要你是一致的,你选择哪一个都不重要。 但是,使用双引号可以执行字符串插值 ,您将在本教程中了解到。
要在程序中显示一个字符串,可以使用print
方法:
print "Let's print out this string."
print
方法显示正确写入的字符串。
试试看。 使用文本编辑器创建一个名为print.rb
的新Ruby程序,并使用print
打印三个字符串:
print 'This is the first string.'
print 'This is the second string.'
print 'This is the third string.'
保存文件并运行程序:
ruby print.rb
您将看到以下输出:
OutputThis is the first string.This is the second string.This is the third string.
而不是在自己的线上打印的三个字符串,所有三个字符串在一行打印在一起。 print
方法将字符串打印到屏幕上,但是如果您想要每个字符串在自己的行上,您必须自己添加换行字符。
如果您希望在单独的行上使用所有三个字符串,请改用puts
方法。 修改程序以使用puts
而不是print
:
puts 'This is the first string.'
puts 'This is the second string.'
puts 'This is the third string.'
现在再次运行程序,你会看到这个输出:
OutputThis is the first string.
This is the second string.
This is the third string.
puts
方法打印您指定的字符串,但也为您的字符串的末尾添加换行符。
将字符串存储在变量中
变量是对计算机内存中某个地方的命名引用。 您可以使用变量存储数据并稍后检索。
要将字符串存储在变量中,请定义变量名称并分配字符串的值:
my_string = 'This is my string'
然后,要检索该值,请使用变量的名称:
print my_string
要自己测试一下,在编辑器中创建一个文件string_variables.rb
并添加以下代码:
my_name = "Sammy the Shark"
my_age = "none of your business"
puts my_name
puts my_age
这个程序定义了两个变量: my_name
和my_age。 每个变量都分配一个字符串。 然后我们使用puts
方法打印出自己行上的每个字符串。
保存文件并执行程序:
ruby string_variables.rb
您将看到以下输出:
OutputSammy the Shark
none of your business
通过为变量分配字符串,您可以避免在每次使用它时一遍一遍地输入相同的字符串,从而更容易处理和操作程序中的字符串。
我们来看一下如何将字符串连接在一起以创建新的字符串。
字符串连接
连接意味着将两个或多个字符串连接在一起以创建一个新的字符串。 为了连接,我们使用由+
符号表示的级联运算符。 +
符号也是与算术运算一起使用的加法运算符。
以下是您将字符串sammy
和shark
连接在一起的方式:
"sammy" + "shark"
这将产生以下输出:
Outputsammyshark
连接将字符串连接到一起,并将其组合并输出全新的字符串值。 如果你想要在sammy
和shark
之间有一个空格,你必须将这个空格包含在一个字符串中,如下所示:
"sammy " + "shark"
现在,您不会在程序中真正编写这样的代码,但是您需要经常混合字符串和变量,这就是连接的来源。
以下是一个例子:
color = "Blue"
print "My favorite color is " + color
这将导致输出My favorite color is blue
。 请注意,我们在字符串后面留下一个空格,所以输出将在输出中的字符串和变量的值之间有一个空格。
您可以通过这种方式连接多个字符串。 创建文件concatenation.rb
并添加以下代码:
my_name = "Sammy the Shark"
my_age = "none of your business"
puts "My name is " + my_name + " and my age is " + my_age + "."
这个程序定义了两个变量: my_name
和my_string
,每个变量都有自己分配的字符串,就像你以前一样。 但是这次,我们打印一个使用连接的字符串,而不是打印这些值,而是用更多的上下文来打印这些值。
运行此程序时,您将看到以下输出:
OutputMy name is Sammy the Shark and my age is none of your business.
在这个小程序中,您使用连接将变量插入到此字符串中。
当您通过连接组合两个或多个字符串时,您将创建一个可以在整个程序中使用的新字符串,因此您可能需要将创建的字符串分配给可用于以后使用的新变量:
my_name = "Sammy the Shark"
my_age = "none of your business"
# assign concatenated string to variable
output = "My name is " + my_name + " and my age is " + my_age + "."
# Print the output.
puts output
在这样的小程序中,使用额外的output
变量可能是不必要的。 但是在较大的程序中,您可能需要使用多个地方使用的连接来创建一个字符串。 分离数据处理(如级联和算术)与输出也是一个好习惯,因为最终您的程序将变得更大,您将需要将逻辑和输出分离成单独的文件或组件,使其更易于管理。
确保不要在两种不同的数据类型之间使用+
运算符。 例如,您不能将字符串和整数连接在一起。
要查看会发生什么,请创建一个名为strings_and_integers.rb
的新程序, strings_and_integers.rb
包含以下内容:
my_name = "Sammy the Shark"
my_number = 27
print my_name + my_number
这一次我们有my_name
,它包含Sammy the Shark
和my_number
,它包含整数27
。 我们知道27
不是字符串,因为它被引号包围。 它也没有小数点,所以我们知道它是一个整数。
如果您运行该程序:
ruby strings_and_ints.rb
您会看到此错误消息:
Outputstrings_and_ints.rb:4:in `+': no implicit conversion of Integer into String (TypeError)
from strings_and_ints.rb:4:in `<main>'
no implicit conversion of Integer into String
的错误意味着Ruby只能将一个字符串连接到现有的字符串。
在Ruby 2.3及更低版本中,您会看到此错误消息:
strings_and_ints.rb:4:in `+': no implicit conversion of Fixnum into String (TypeError)
from strings_and_ints.rb:4:in `<main>'
关键字Fixnum
是以前版本的Ruby中提供给整数的数据类型。 它是固定号码的缩写。 在Ruby 2.4中, Fixnum
及其对应的Bignum
不再存在,而是用Integer
代替。
我们可以改变我们的程序,并将数字27
放在引号( "27"
)中,以便将其声明为字符串而不是整数。 或者我们可以在创建字符串时将数字转换为字符串,如下所示:
my_name = "Sammy the Shark"
my_number = 27
print my_name + my_number.to_s
.to_s
方法将整数转换为字符串。 这是一个更好的方法,因为它允许我们将我们的数字作为整数保存在我们的程序中。 当我们打印出来时,我们只需要一个字符串,但是如果我们必须在程序逻辑的其他部分使用它,我们可能希望它是一个整数。
再次运行该程序,您会看到Sammy the Shark27
打印到屏幕上。
将数字转换为串联的字符串是处理邮政编码,货币,电话号码和要在屏幕上显示的其他数字数据时经常遇到的问题。
连接是强大的,但它可能是棘手的。 如果您不慎离开其中一个+
运算符,则可能会收到语法错误。 并且如果您必须连接带有数字的变量的字符串,则必须将变量转换为字符串。 Ruby提供了另一种将变量值注入到字符串中的方法,称为字符串插值 ,用于解决这两个问题。
使用字符串插值
连接字符串和变量时,输出可能难以读取和调试。 字符串插值通过让您将表达式嵌入到用双引号括起来的字符串中来解决这个问题。
而不是写这个:
"My name is " + my_name + "!"
你可以这样做:
"My name is #{my_name}!"
不用终止字符串并使用+
运算符,用#{}
语法来包含变量。 这个语法告诉Ruby来评估表达式并将其注入到字符串中。
试试看。 创建一个名为interpolation.rb
的新程序并添加以下代码:
my_name = "Sammy the Shark"
my_age = "none of your business"
output = "My name is #{my_name} and my age is #{my_age}."
puts output
这是您已经编写的程序,但这次我们使用字符串插值来创建输出。
字符串插值有另一个好处:它可以自动将数值转换为字符串。 记住你的strings_and_integers.rb
程序? 再次在编辑器中打开该文件,但更改最后一行,如下所示:
my_name = "Sammy the Shark"
my_number = 27
# use interpolation instead of concatenation
print "My name is #{my_name} and my favorite number is #{my_number}."
Ruby将自动将my_number
转换为字符串,并且您的程序将在运行时打印以下输出:
OutputMy name is Sammy the Shark and my favorite number is 27.
字符串插值功能强大而方便。 它也是连接变量字符串的首选方法。
字符串字面值和字符串值
请注意,您创建的所有字符串都用代码中的引号括起来,但实际的打印输出不包括引号。
当提到这些中的每一个时,都有区别。 字符串文字是字符串,因为它是用源代码编写的,包括引号。 字符串值是您在输出中看到的值 ,不包括引号。
这是一个字符串字面值:
"Sammy the Shark"
字符串值将是Sammy the Shark
。
在大多数情况下,您不必担心这种差异,除非您要在字符串中使用引号或撇号等特殊字符。
在字符串中逃避行情和撇号
由于引号用于表示字符串,所以如果要在字符串中使用撇号和引号,则必须进行一些额外的工作。
如果您尝试在单引号字符串中使用撇号,如下所示:
'This isn't what I wanted.'
撇号isn't
结束字符串,你可以从这个例子中的奇怪的突出显示。 因此,Ruby解释器将尝试将其余的预期字符串解析为代码,您将收到错误。
如果您使用双引号括起来的字符串中使用双引号,那么您将遇到相同的情况:
"Sammy says, "Hello!""
在这个例子中,关闭双引号前面的Hello
终止字符串,双引号在Hello!
创建一个没有匹配的双引号来终止它的新字符串,所以Ruby会显示错误。
为了避免这个问题,你有几个选择。 首先,您可以使用备用语法来创建字符串; 如果您必须在字符串中使用双引号,则使用单引号来定义字符串,反之亦然。 您也可以转义引号,也可以使用不同的Ruby语法定义字符串。 我们来看看每一种方法。
选项1:使用替代字符串语法
解决这些问题的最简单的方法是在字符串需要包含双引号时将字符串括在单引号中,并在字符串需要使用单引号时将字符串括在双引号中。
而不是使用单引号定义此字符串:
'This isn't what I wanted.'
用双引号定义它:
"This isn't what I wanted."
而不是使用双引号来定义这个字符串:
"Sammy says, "Hello!""
使用单引号
'Sammy says, "Hello!"'
使用替代语法可以让你摆脱一些快速的卡纸,但并不总是会奏效。 例如,这两个方法都不适用于此字符串:
"Sammy says, "I'm a happy shark!""
在这个例子中,关闭双引号在I'm
面前真的是抛出了一切。 这会终止第一个字符串,然后Ruby遇到I'm
的撇号,它开始一个新的字符串,值为ma happy shark!""
。 但是这个新的字符串没有匹配的单引号来终止它。 并且使用单引号来包含字符串引入了类似的问题:
'Sammy says, "I'm a happy shark!"'
这一次, I'm
的撇号终止了字符串。
使用替代语法也可以使您的代码不一致。 字符串语法之间不断的翻转可能会令人困惑,我们可以转义字符来解决这个问题。
选项2:在字符串中转义字符
反斜杠字符( \
)(通常称为字符串中的转义字符)将阻止Ruby解释字符串中的下一个字符。
这是我们的有问题的字符串,用双引号编码,带双引号:
"Sammy says, "I'm a happy shark!""
创建一个名为quoting.rb
的新Ruby程序,并将此代码添加到文件中:
print "Sammy says, "I'm a happy shark!""
运行程序:
ruby quoting.rb
你会看到这个输出:
Outputquoting.rb:1: syntax error, unexpected tCONSTANT, expecting end-of-input
print "Sammy says, "I'm a happy shark!""
^
要修复错误,请使用内部双引号前面的反斜杠:
print "Sammy says, \"I'm a happy shark!\""
然后再次运行该程序,您将看到您期望的输出:
Sammy says, "I'm a happy shark!"
注意,在这个例子中你不必逃避撇号,因为没有冲突。 你只需要避免引起Ruby的混淆。
您可以避免使用不同的语法来定义字符串来完全转义引号。
选项3:为字符串使用替代语法
到目前为止,您已经使用引号来定义字符串的边界。 您可以使用其他字符在Ruby中创建字符串您可以通过在百分号后面指定,来定义要用于包围字符串的分隔符或字符,如下所示:
%$Sammy says, "I'm a happy shark!"$
这种语法会自动为您释放嵌入的字符串。 实际的字符串如下所示:
"Sammy says, \"I'm a happy shark!\""
但是,更改分隔符意味着如果需要使用分隔符,则必须转义分隔符。 在这种情况下。 如果您必须在字符串中使用美元符号,则需要在字符串中避开字面美元符号。
为了避免这种情况,您还可以使用大括号,方括号或圆括号作为分隔符。 花括号最常见:
%{Sammy says, "I'm a happy shark!"}
如果需要,这些表单都支持字符串插值。
droplets = 5
print %{Sammy says, "I just created #{droplets} droplets!"}
您还将看到%Q{}
和%q{}
用于定义Ruby程序中的字符串。 %Q{}
语法的工作原理与双引号字符串完全相同,这意味着您不必使用双重排列,您可以使用字符串插值:
droplets = 5
print %Q{Sammy says, "I just created #{droplets} droplets!"}
%q{}
语法与单引号字符串完全相同:
%q{Sammy says, "I'm a happy shark!"}
您可能会看到在一些程序中使用圆括号或方括号的%q
和%Q
语法,而不是花括号。
您可以看到,有很多方法可以在Ruby中创建字符串。 无论您选择何种方法,您的代码都是一致的。 你会发现%Q{}
和%{}
方法是最常见的。
现在你知道如何处理特殊字符,我们来看看如何处理长字符串和换行符。
长串和新线
有时您可能需要在字符串中插入换行符或回车符。 您可以使用\n
或\r
转义字符在代码中插入换行符:
output = "This is\na string\nwith newlines"
puts output
该程序将产生此输出:
OutputThis is
a string
with newlines
这在技术上可以使我们的输出多行。 然而,在一行中写一个很长的字符串将很快变得很难阅读和使用。 有几个解决方案。
首先,您可以使用连接运算符将字符串拆分成多行:
output = "This is a\n" +
"longer string\n" +
"with newlines."
puts output
这只是将三个字符串连接在一起,类似于你已经做的。
您也可以直接将换行符放在字符串中:
output = "This is a
longer string
with newlines"
puts output
您还可以使用任何替代字符串语法来创建多行字符串:
output = %{This is a
longer string
with newlines}
puts output
在这两个例子中,请注意我们不需要换行符( \n
)。 这种方法保留空格,包括缩进和换行。
因此,输出将包含换行符以及所有的主要缩进,如下所示:
OutputThis is a
longer string
with newlines
为了防止这种情况,请从代码中删除额外的空格:
output = %{This is a
longer string
with newlines
}
您还可以使用heredoc创建多行字符串,也可以使用“here”文档,这是程序中用于多行字符串文字的术语。 以下是编写该代码的方法:
output = <<-END
This is a
longer string
with newlines
END
<<-END
和END
标记表示heredoc的开始和结束。
Ruby中的Heredocs还保留空格字符,这意味着如果您将代码缩进到heredoc中,则还会保留前导缩进。 所以这段代码:
output = <<-END
This is a
longer string
with newlines
END
将打印出两个缩进的空格。
Ruby 2.3及更高版本提供了自动删除这个领先空白的“波浪heredoc”语法。 用波浪符号替换heredoc定义中的连字符,所以<<-
变成<<~
,像这样:
output = <<~END
This is a
longer string
with newlines
and the code is indented
but the output is not.
END
这产生以下输出:
OutputThis is a
longer string
with newlines
and the code is indented
but the output is not.
这可以让你使用heredocs,并保持你的代码很好缩进。
Ruby中的Heredocs还支持字符串插值。
您可以看到,有很多方法来处理Ruby中的换行符和多行字符串。 当您使用现有的Ruby代码时,会遇到所有这些方法,因为每个项目都有自己的风格。 在您自己的代码中,选择适合您的风格,并保持一致。
字符串复制
有时您可能需要使用Ruby重复一串字符多次。 您可以使用*
操作符。 像+
运算符一样,当与数字一起使用时, *
运算符具有不同的用途,它是乘法运算符。 当与一个字符串和一个整数一起使用时, *
是字符串复制运算符 ,重复单个字符串,但多次您希望使用您提供的整数。
要打印出Sammy
九次,您可以使用以下代码:
print "Sammy" * 9
此代码产生以下输出:
OutputSammySammySammySammySammySammySammySammySammy
您可以使用它来创建一些不错的ASCII艺术。 创建一个名为banner.rb
的文件并添加以下代码:
puts "=" * 15
puts "| Hello World |"
puts "=" * 15
您可以在运行程序之前绘制程序会产生什么?
它产生这个输出:
Output===============
| Hello World |
===============
这只是一个小例子,说明如何使计算机为您执行重复任务。
结论
在本教程中,您学习了如何使用Ruby编程语言中的String数据类型。 您创建了新的字符串,并将它们与其他字符串连接起来,并处理换行符,引号和撇号。 然后,您使用字符串插值来使混合字符串和变量值更容易,您学习了如何重复字符串。