A string是一个或多个字符的序列,可以由字母、数字或符号组成。
Ruby 中的字符串是对象,与其他语言不同,字符串是mutable,这意味着可以就地更改它们,而不用创建新字符串。
您几乎会在编写的每个程序中使用字符串。字符串允许您使用文本显示用户并与用户进行交流。事实上,您现在正在阅读的页面是由通过网络浏览器显示在屏幕上的字符串组成的。字符串是编程最重要的基础之一。
在本教程中,您将学习如何在 Ruby 中使用字符串。您将创建字符串,将它们显示在屏幕上,将它们存储在变量中,将多个字符串连接在一起,并学习如何处理特殊字符,例如换行符、撇号和双引号。
字符串存在于任一单引号内'
或双引号"
在 Ruby 中,要创建字符串,请将字符序列括在其中一个或另一个中:
'This is a string in single quotes.'
"This is a string in double quotes."
您可以选择使用单引号或双引号。在大多数情况下,只要保持一致,选择哪一种并不重要。但是,使用双引号可以让您执行字符串插值,您将在本教程中了解这一点。
要在程序中显示字符串,可以使用print
method:
print "Let's print out this string."
The print
方法完全按照书写方式显示字符串。
试试看。创建一个新的 Ruby 程序 called print.rb
使用文本编辑器并使用print
打印三个字符串的方法:
print.rb
print 'This is the first string.'
print 'This is the second string.'
print 'This is the third string.'
保存文件并运行程序:
您将看到以下输出:
Output
This is the first string.This is the second string.This is the third string.
三个字符串不是打印在各自的行上,而是所有三个字符串一起打印在一行上。这print
方法将字符串打印到屏幕上,但如果您希望每个字符串独占一行,则必须自己添加换行符。
如果您希望所有三个字符串位于不同的行上,请使用puts
方法代替。修改您的程序以使用puts
代替print
:
print.rb
puts 'This is the first string.'
puts 'This is the second string.'
puts 'This is the third string.'
现在再次运行该程序,您将看到以下输出:
Output
This is the first string.
This is the second string.
This is the third string.
The puts
方法打印您指定的字符串,但还会在字符串末尾添加换行符。
变量是对计算机内存中某个位置的命名引用。您可以使用变量来存储数据并在以后检索它。
要将字符串存储在变量中,请定义变量名称并分配字符串的值:
my_string = 'This is my string'
然后,要检索该值,请使用变量的名称:
要亲自测试一下,请创建文件string_variables.rb
在编辑器中使用以下命令:
然后添加以下代码:
字符串变量.rb
my_name = "Sammy the Shark"
my_age = "none of your business"
puts my_name
puts my_age
该程序定义了两个变量:my_name
and my_age
。每个变量都分配有一个字符串。然后我们使用puts
方法在其自己的行上打印每个字符串。
保存文件CTRL + X
and y
,然后执行程序:
您将看到以下输出:
Output
Sammy the Shark
none of your business
通过将字符串分配给变量,您可以避免每次使用时都重复输入相同的字符串,从而更轻松地在程序中使用和操作字符串。
让我们看看如何将字符串连接在一起以创建新字符串。
级联意味着将两个或多个字符串连接在一起以创建一个新字符串。为了连接,我们使用连接运算符,由 a 表示+
象征。这+
当与算术运算一起使用时,符号也是加法运算符。
这是连接字符串的方法sammy
and shark
一起:
这将产生以下输出:
Output
sammyshark
连接将字符串首尾相连,将它们组合起来并输出一个全新的字符串值。如果你想在单词之间有一个空格sammy
and shark
,您必须在其中一个字符串中包含该空格,如下所示:
"sammy " + "shark"
现在,您实际上不会在程序中编写这样的代码,但您需要经常将字符串和变量混合在一起,这就是连接的用武之地。
这是一个例子:
color = "Blue"
print "My favorite color is " + color
这将导致输出My favorite color is blue
。请注意,我们在单词后面留了一个空格is
在字符串中,因此输出在字符串和输出中变量的值之间会有一个空格。
您可以通过这种方式将多个字符串连接在一起。创建文件concatenation.rb
并添加以下代码:
连接.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
and my_age
,每个都有自己指定的字符串,就像您之前所做的那样。但这一次,我们不是打印值,而是打印一个字符串,该字符串使用串联来打印带有更多上下文的这些值。
当您运行该程序时,您将看到以下输出:
Output
My name is Sammy the Shark and my age is none of your business.
在这个小程序中,您使用串联将变量插入到该字符串中。
当您通过串联组合两个或多个字符串时,您将创建一个可以在整个程序中使用的新字符串,因此您可能需要将创建的字符串分配给一个稍后可以使用的新变量:
连接.rb
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
包含以下内容:
字符串和整数.rb
my_name = "Sammy the Shark"
my_number = 27
print my_name + my_number
这次我们有my_name
它保存着字符串Sammy the Shark
and my_number
它保存整数27
。我们知道27
不是字符串,因为它没有用引号引起来。它也没有小数点,所以我们知道它是一个整数。
如果运行该程序:
您将看到此错误消息:
Output
strings_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"
),以便将其声明为字符串而不是整数。或者我们可以在创建字符串时将数字转换为字符串,如下所示:
字符串和整数.rb
my_name = "Sammy the Shark"
my_number = 27
print my_name + my_number.to_s
The .to_s
方法将整数转换为字符串。这是一种更好的方法,因为它可以让我们在程序中将数字保留为整数。当我们打印出来时,我们只需要它是一个字符串,但如果我们必须在程序逻辑的其他部分使用它,我们可能希望它是一个整数。
再次运行程序你会看到Sammy the Shark27
打印到屏幕上。
在处理邮政编码、货币、电话号码和其他想要与文本一起显示在屏幕上的数字数据时,您会经常遇到将数字转换为字符串以进行连接的情况。
连接很强大,但也可能很棘手。如果您不小心遗漏了其中一项+
运算符,您可能会收到语法错误。如果必须将字符串与保存数字的变量连接起来,则必须将变量转换为字符串。 Ruby 提供了另一种将变量值注入字符串的方法,称为字符串插值解决了这两个问题。
连接字符串和变量时,输出可能难以读取和调试。字符串插值通过让您将表达式嵌入到用双引号括起来的字符串中来解决这个问题。
而不是这样写:
"My name is " + my_name + "!"
你可以这样做:
而不是终止字符串并使用+
运算符,您可以将变量括起来#{}
句法。此语法告诉 Ruby 计算表达式并将其注入到字符串中。
试试看。创建一个新程序,名为interpolation.rb
并添加以下代码:
插值.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
程序?再次在编辑器中打开该文件,但更改最后一行,使其如下所示:
字符串和整数.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
到一个字符串,你的程序将在运行时打印以下输出:
Output
My name is Sammy the Shark and my favorite number is 27.
字符串插值功能强大且方便。它也是连接字符串与变量的首选方法。
请注意,您创建的所有字符串都用代码中的引号括起来,但实际打印的输出不包含引号。
提及其中每一个时都有区别。 A字符串字面量是源代码中编写的字符串,包括引号。 A字符串值是您在输出中看到的内容,并且不包含引号。
这是一个字符串文字:
字符串值将是Sammy the Shark
.
在大多数情况下,您不必担心这种差异,除非您想在字符串中使用特殊字符,例如引号或撇号。
由于引号用于表示字符串,因此如果您想在字符串中使用撇号和引号,则必须做一些额外的工作。
如果您尝试在单引号字符串中间使用撇号,如下所示:
'This isn't what I wanted.'
中的撇号isn't
结束字符串,正如您从本示例中奇怪的突出显示中看到的那样。因此,Ruby 解释器将尝试将预期字符串的其余部分解析为代码,并且您将收到错误。
如果在用双引号括起来的字符串中使用双引号,您会遇到相同的情况:
在此示例中,前面的右双引号Hello
终止字符串,后面的双引号Hello!
创建一个新字符串,但没有匹配的双引号来终止它,因此 Ruby 将显示错误。
为了避免这个问题,您有几种选择。首先,您可以使用替代语法来创建字符串;如果必须在字符串中使用双引号,请使用单引号来定义字符串,反之亦然。你也可以escape引号,或者您可以使用不同的 Ruby 语法来定义字符串。让我们看看每种方法。
解决这些问题的最简单方法是,当字符串需要包含双引号时,将字符串括在单引号中;当字符串需要使用单引号时,将字符串括在双引号中。
而不是用单引号定义此字符串:
'This isn't what I wanted.'
用双引号定义它:
"This isn't what I wanted."
并且不使用双引号来定义此字符串:
使用单引号:
使用替代语法可以让你摆脱一些快速的困境,但它并不总是有效。例如,这两种方法都不适用于以下字符串:
"Sammy says, "I'm a happy shark!""
在此示例中,前面的右双引号I'm
真的很糟糕。这会终止第一个字符串,然后 Ruby 会遇到撇号I'm
,它以值开始一个新字符串m a happy shark!""
。但这个新字符串没有匹配的单引号来终止它。使用单引号将字符串括起来也会带来类似的问题:
'Sammy says, "I'm a happy shark!"'
这次的撇号I'm
终止字符串。
使用替代语法也会使您的代码不一致。不断地在字符串语法之间切换可能会让人感到困惑,我们可以转义字符来解决这个问题。
反斜杠字符 (\
),通常称为转义字符在字符串中,将阻止 Ruby 按字面解释字符串中的下一个字符。
这是我们有问题的字符串,用双引号编码,里面有双引号:
"Sammy says, "I'm a happy shark!""
创建一个名为的新 Ruby 程序quoting.rb
并将此代码添加到文件中:
引用.rb
print "Sammy says, "I'm a happy shark!""
运行程序:
你会看到这个输出:
Output
quoting.rb:1: syntax error, unexpected tCONSTANT, expecting end-of-input
print "Sammy says, "I'm a happy shark!""
^
要修复该错误,请在内部双引号前面使用反斜杠:
引用.rb
print "Sammy says, \"I'm a happy shark!\""
然后再次运行该程序,您将看到预期的输出:
Sammy says, "I'm a happy shark!"
请注意,在此示例中您不必转义撇号,因为不存在冲突。您只需要转义会使 Ruby 感到困惑的引号。
您可以通过使用不同的语法来定义字符串来完全避免转义引号。
到目前为止,您已经使用引号来定义字符串的边界。您也可以使用其他字符在 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{}
and %q{}
用于在 Ruby 程序中定义字符串。这%Q{}
语法的工作方式与双引号字符串完全相同,这意味着您不必转义双引号,并且您将能够使用字符串插值:
droplets = 5
print %Q{Sammy says, "I just created #{droplets} droplets!"}
The %q{}
语法的工作方式与单引号字符串完全相同:
%q{Sammy says, "I'm a happy shark!"}
您可能会看到%q
and %Q
在某些程序中使用括号或方括号代替花括号的语法。
正如您所看到的,在 Ruby 中创建字符串的方法有很多。无论您选择哪种方法,请在代码中保持一致。你会发现%Q{}
and %{}
方法是最常见的。
现在您已经知道如何处理特殊字符,让我们看看如何处理长字符串和换行符。
有时您可能需要在字符串中插入换行符或回车符。您可以使用\n
or \r
转义字符以在代码中插入换行符:
output = "This is\na string\nwith newlines"
puts output
该程序将产生以下输出:
Output
This 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
) 人物。这种方法保留空白,包括缩进和换行符。
因此,输出将包含换行符以及所有前导缩进,如下所示:
Output
This is a
longer string
with newlines
为了防止这种情况,请从代码中删除多余的空格:
output = %{This is a
longer string
with newlines
}
您还可以使用创建多行字符串heredoc,或“此处文档”,用于程序中多行字符串文字的术语。以下是编写该代码的方式:
output = <<-END
This is a
longer string
with newlines
END
The <<-END
and END
标记表示定界符的开始和结束。
Ruby 中的 Heredocs 还保留空白字符,这意味着如果您缩进 Heredoc 中的代码,前导缩进也会保留。所以这段代码:
output = <<-END
This is a
longer string
with newlines
END
打印出来会有两个缩进空间。
Ruby 2.3 及更高版本提供了“squiggly Heredoc”语法,可以自动删除这个前导空格。将heredoc定义中的连字符替换为波形符,因此<<-
变成<<~
, 像这样:
output = <<~END
This is a
longer string
with newlines
and the code is indented
but the output is not.
END
这会产生以下输出:
Output
This is a
longer string
with newlines
and the code is indented
but the output is not.
这使您可以使用此处文档并保持代码良好缩进。
Ruby 中的 Heredocs 还支持字符串插值。
正如您所看到的,Ruby 中有很多处理换行符和多行字符串的方法。当您使用现有的 Ruby 代码时,您将遇到所有这些方法,因为每个项目往往都有自己的风格。在您自己的代码中,选择适合您的样式并保持一致。
有时您可能需要使用 Ruby 多次重复一串字符。您可以使用*
操作员。像+
运营商,*
运算符在与数字一起使用时有不同的用途,它是乘法运算符。当与一个字符串和一个整数一起使用时,*
is the 字符串复制运算符,重复单个字符串,无论您想使用您提供的整数多少次。
打印出来Sammy
九次,您将使用以下代码:
此代码产生以下输出:
Output
SammySammySammySammySammySammySammySammySammy
您可以使用它来创建一些漂亮的 ASCII 艺术作品。创建一个名为banner.rb
并添加以下代码:
puts "=" * 15
puts "| Hello World |"
puts "=" * 15
你能想象程序在运行之前会产生什么吗?
它产生以下输出:
Output
===============
| Hello World |
===============
这只是一个小例子,说明如何让计算机为您执行重复性任务。
在本教程中,您学习了如何在 Ruby 编程语言中使用字符串数据类型。您创建了新字符串,将它们与其他字符串连接,并处理换行符、引号和撇号。然后,您使用字符串插值来更轻松地混合字符串和变量值,并且学习了如何重复字符串。