深入理解Ruby数据类型:从基础到高级应用

引言

当你编写程序时,你需要使用数据类型来对数据进行分类。数据类型告诉计算机如何处理程序中的数据,并决定了你可以对数据执行哪些操作。

理解数据类型的一种方式是思考我们在现实世界中使用的不同类型的数据。例如,我们使用整数(0、1、2…)、负整数(-1、0、1…)和无理数(π)。

通常在数学中,我们可以将不同类型的数字组合在一起,并得到某种答案。例如,我们可能想将5加上π。

5 + π

我们可以将方程作为答案保留以解决无理数的问题,或者我们可以将π四舍五入到小数点后几位,然后将这些数字相加。

5 + π = 5 + 3.14 = 8.14

但是,如果我们尝试使用另一种数据类型,比如文字,来评估数字,事情就开始变得不太有意义。我们要如何解决下面的方程?

sky + 8

这不是我们能立刻解决的问题。计算机也无法解决,因为这些数据是两种不同的类型。“天空”是一个词,而8是一个整数。当我们编写程序时,我们必须小心地赋值并使用加法、减法、乘法等操作对其进行处理。

在本教程中,您将学习有关Ruby原生数据类型最重要的知识:整型、浮点型、字符串、符号、数组和散列。这并不是对数据类型进行详尽的研究,但它将帮助您熟悉在程序中可用的选项。

然后您将学习动态类型。Ruby程序根据变量所包含的内容来确定数据类型,因此了解动态类型的工作原理将帮助您避免在自己的程序中遇到棘手的情况。而且由于变量可以包含任何值,您将学习如何识别变量的数据类型。

让我们从学习如何在Ruby中处理整数开始。

整数

和数学一样,在计算机编程中,整数是指可以是正数、负数或者0(…,-1,0,1,…)的整数。整数也常被称为int

你可以像这样打印出一个整数。

print -25
输出
-25

你还可以把整数存储在一个变量中,并通过引用变量来打印出该值。

my_int = -25
print my_int
输出
-25

你也可以使用整数进行数学运算。比如,你可以计算两个数字的和,并打印出结果。

sum = 116 - 68
print sum
输出
48

当我们写大数字时,我们倾向于使用逗号来使其更易读。例如,我们会将“一百万”写为1,000,000。你不能在你的代码中使用逗号,但是Ruby允许你使用下划线(_)字符来使大数字更易读。

试一下吧。

大数字的Ruby文件。
large_number = 1_234_567
print large_number

您将看到整数的输出结果没有下划线:

输出
1234567

如果你需要在程序中表示大数字,下划线可以让你编写更易读的代码。

当你对Ruby语言了解得更多时,你将有更多的机会来处理整数。现在让我们来看看如何处理实数。

浮点数

浮点数或者浮点型代表着实数。实数既可以是有理数,也可以是无理数;比如9.0或者-116.42这种包含小数部分的数字。换句话说,在Ruby程序中,浮点数就是包含小数点的数字。

你可以像打印整数一样打印浮点数,Ruby中是允许的。

print 17.3
输出
17.3

你也可以声明一个变量并赋予一个浮点值。

my_float = 17.3
print my_float
输出
17.3

而且,就像对整数一样,你也可以在Ruby中对浮点数进行数学运算。

sum = 564.0 + 365.24
print sum
输出
929.24

如果你在Ruby中把一个浮点数加到一个整数上,那么结果会是一个浮点数。

sum = 564 + 365.24
print sum
输出
929.24

在Ruby中,如果一个数没有小数点,它将被视为整数(例如138),而如果一个数有小数点,则被视为浮点数(例如138.0)。

接下来,让我们来看一看Ruby中的布尔值。

布尔数据类型

在计算机科学中,布尔值用于表示与逻辑分支相关的真值,从而为算法提供信息。在Ruby中,我们用两个值之一来表示这种数据类型,即truefalse

在数学中,许多运算会给我们带来可以判断为真或假的答案。

  • 大于
  • 500 > 100 为真
  • 1 > 5 为假
  • 小于
  • 200 < 400 为真
  • 4 < 2 为假
  • 等于
  • 5 = 5 为真
  • 500 = 400 为假

就像数字一样,你可以将truefalse值存储在一个变量中。

result = 5 > 8

你可以通过调用print()函数将布尔值打印出来。

print result

由于5不大于8,您将看到以下结果:

输出

随着您编写更多Ruby程序,您将更加熟悉布尔类型的工作方式,以及不同的函数和操作如何评估为truefalse,从而改变程序的执行流程。

接下来,让我们来探索如何在我们的程序中处理文本。

字符串(String)

字符串是由一个或多个字符组成的序列,例如字母、数字和符号。在Ruby中,字符串主要存在于单引号(')或双引号(")之间。因此,要创建一个字符串,需要将字符序列用引号括起来,如下所示:

"这是一个用双引号括起来的字符串。"

经典的“Hello, World!”小程序展示了字符串在计算机编程中是如何被使用的,因为构成“Hello, World!”这个短语的字符组成了一个字符串。

print "Hello, World!"

与其他数据类型一样,您可以在变量中存储字符串。

output = "Hello, World!"

通过调用变量来打印字符串。

print output
输出

Hello, World!

和数字一样,在我们的程序中可以对字符串执行许多操作,以便操纵它们以达到我们所寻求的结果。字符串对于向用户传递信息以及用户向程序传递信息都非常重要。

有时候你需要处理一些数据列表。这就是数组派上用场的地方。

数组(Array)

数组(Arrays)

数组是一种可以在单个变量中存储多个值的数据结构。这意味着你可以在一个数组中包含一个值列表,并对其进行迭代。数组中的每个项目或值被称为一个元素

通过在方括号 [ ] 中指定逗号分隔的值来定义数组。

一个整数数组的示例如下:

[-3, -2, -1, 0, 1, 2, 3]

一个浮点数数组的示例如下:

[3.14, 9.23, 111.11, 312.12, 1.05]

一个字符串列表的示例如下:

['shark', 'cuttlefish', 'squid', 'mantis shrimp']

像其他数据类型一样,你可以将数组赋值给一个变量。

sea_creatures = ['shark', 'cuttlefish', 'squid', 'mantis shrimp']

如果我们打印这个变量,输出结果将与我们创建的数组完全相同。

print sea_creatures
['shark', 'cuttlefish', 'squid', 'mantis shrimp']

通过使用索引号来访问数组中的单个元素,索引号从 0 开始。

puts sea_creatures[0] # shark
puts sea_creatures[2] # squid

要打印出最后一个值,你可以使用索引 -1。Ruby 还提供了 .first.last 方法,分别用于获取数组的第一个和最后一个元素。

puts sea_creatures.first # shark
puts sea_creatures.last # mantis shrimp

在 Ruby 中,数组可以包含多种不同类型的数据。你可以将字符串、符号甚至其他数组存储在一个数组中。

record = [
:en,
"Sammy",
42,
[
"coral",
"reef"
]
]

在 Ruby 中,数组是可变的,这意味着你可以添加值、删除值甚至修改数组中的条目。

有时我们在程序中需要一种用来标记事物的方法。这就是符号的作用所在。

符号(Symbols)

符号是一种特殊的数据类型,在 Ruby 程序中充当标签或标识符的作用。符号是不可变的,这意味着它们不能被改变。一个符号看起来像一个没有值的变量声明。以下是一个符号的例子:

:time_zone

在 Ruby 中,通常使用符号来标识重要的内容,而对于需要处理或操作的文本,则使用字符串。在 Ruby 程序中,每个字符串都是单独的对象,具有自己在内存中的唯一位置,即使这些字符串是相同的。

但是如果您多次引用相同的符号,那么您在程序中引用的是同一个对象,这意味着您在引用同一个内存位置。

当我们研究哈希时,你会看到这个概念的实际运用,它允许你将键与值关联起来。

哈希(Hashes)

这是文章《理解 Ruby 中的数据类型》的第4部分(共6部分)。

哈希(Hash)是一种类似字典的键值对集合。这些键值对提供了一种便捷的方式来存储和访问数据。哈希通常用于存储相关的数据,例如用户信息。你可以像这样定义一个哈希:

{"first_name" => "Sammy", "last_name" => "Shark"}

你可以像其他数据类型一样,将哈希赋值给变量:

user = {"first_name" => "Sammy", "last_name" => "Shark"}

从哈希中检索值时,使用对应的键来获取值:

print user["first_name"] # "Sammy"
print user["last_name"] # "Shark"

你也可以使用符号(Symbol)作为哈希中的键,而不是字符串:

user = {:first_name => "Sammy", :last_name => "Shark"}

建议尽可能使用符号作为哈希键。每个符号实例都指向相同的对象,而每个字符串实例都指向一个唯一的对象。使用符号作为键可以获得稍好的性能和更少的内存使用。

当你使用符号作为键时,也需要使用符号来检索值:

print user[:first_name] # "Sammy"
print user[:last_name] # "Shark"

在定义哈希时,你还可以使用稍微不同的语法:

user = {first_name: "Sammy", last_name: "Shark"}

这种语法与JavaScript等其他语言使用的语法相似。这种语法将键定义为符号,因此你可以使用 :first_name:last_name 来访问条目,而不是字符串 "first_name""last_name"

你已经了解了几种数据类型,现在让我们看看 Ruby 是如何与这些类型一起工作的。

动态类型

在 Ruby 中,您在赋值之前无需显式声明数据类型;赋值的值决定了数据类型。Ruby 使用动态类型,这意味着类型检查发生在运行时而不是编译时,这与使用静态类型语言不同。Ruby 根据变量中存储的数据确定数据类型。这与 Python 和 JavaScript 中的数据类型处理方式类似。

以下示例中的变量 t 可以设置为任何可用的数据类型:

t = 42 # t 是一个 Integer(整数)
t = "Sammy" # t 是一个 String(字符串)
t = :sammy # t 是一个 Symbol(符号)
t = true # t 是一个 boolean(布尔值,true)
t = nil # t 是 nil(空值)

在动态类型语言中,您可以重用现有变量来保存不同的数据类型。

当将数据从一种类型转换为另一种类型时,这非常有用。例如,您可能有一段代码,它会要求用户输入一个数值。

print "Please enter the length of the room: "
length = gets.chop

从键盘获取的数据始终是字符串,因此为了进行数学运算,必须将 length 变量的数据转换为数字。在静态类型的语言中,在分配值之前,必须声明变量的数据类型,因此您需要一个新变量来保存转换后的数据。但是在 Ruby 中,由于它是动态类型的,如果您愿意,可以重复使用 length 变量。

# 将值转换为 Float(浮点数)。
length = length.to_f

to_f 方法将字符串转换为浮点数。Ruby 还提供了 to_i 方法,将字符串转换为整数,大多数对象也可以使用 to_s 方法转换为字符串。

42.to_s # "42"
(42.5).to_s # "42.5"
["Sammy", "Shark"].to_s # "[\"Sammy\", \"Shark\"]"

Ruby 是一种动态类型语言,但它不允许在不将不同类型的数据转换为相同类型的情况下执行操作。例如,以下代码将导致错误:

print 5 + "5"
输出
TypeError: String can't be coerced into Integer

这段代码也会出现同样的问题。

print "5" + 5
输出
TypeError: no implicit conversion of Integer into String

如果你想将数字相加得到 10,需要将字符串转换为整数。如果你想将它们连接起来得到 “55”,则需要将整数转换为字符串。

动态类型提供了灵活性,但其缺点是您不能确切地知道正在使用哪种类型的数据,因为变量可以包含任何可用的类型。Ruby 提供了识别数据类型的方法。

识别数据类型

这是文章《理解 Ruby 中的数据类型》的第6部分(共6部分)。

在 Ruby 中,几乎所有东西都是一个对象。整数、浮点数、数组、符号和哈希都是 Ruby 对象,并且它们都有一个名为 class 的方法,可以告诉你它们的类型。即使布尔值 truefalse,以及空值 nil,都是对象。自己试试看吧。

42.class # Integer
(42.2).class # Float
["Sammy", "Shark"].class # Array
true.class # TrueClass
nil.class # NilClass

此外,您可以使用 kind_of? 方法来验证特定类型的数据,如下所示:

42.kind_of?(Integer) # true

当你有一个变量并且想确定它的类型时,这特别有用。

# 在代码的某个地方...
sharks = ["Hammerhead", "Tiger", "Great White"]
...
# 在其他地方...

sharks.kind_of?(Hash) # false
sharks.kind_of?(Array) # true

你也可以使用它来验证来自外部源的数据是否正确。

if data.kind_of? String
data = data.to_f
end

Ruby 还提供了 is_a? 方法,它与 kind_of? 方法的功能相同,但对于一些开发人员来说可能更容易阅读。

if data.is_a? String
data = data.to_f
end

使用 classkind_of?is_a? 可以帮助你确保你正在使用正确类型的数据。随着你对 Ruby 的了解越多,你会发现其他处理数据的方式,而不需要明确检查数据的类型。

结论

在你的 Ruby 程序中,你将使用很多不同的数据类型。现在你对 Ruby 程序中主要的数据类型有了更好的理解。

请阅读这些教程,继续探索 Ruby 的数据类型。

bannerAds