理解 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
Output

-25

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

my_int = -25
print my_int
Output

-25

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

sum = 116 - 68
print sum
Output

48

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

试一下吧。

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

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

Output

1234567

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

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

浮点数

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

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

print 17.3
Output

17.3

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

my_float = 17.3
print my_float
Output

17.3

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

sum = 564.0 + 365.24
print sum
Output

929.24

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

sum = 564 + 365.24
print sum
Output

929.24

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

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

布尔数据类型

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

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

  • greater than
  • 500 > 100 true
  • 1 > 5 false
  • less than
  • 200 < 400 true
  • 4 < 2 false
  • equal
  • 5 = 5 true
  • 500 = 400 false

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

result = 5 > 8

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

print result

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

Output

false

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

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

绳子 zi)

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

"This is a string in double quotes."

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

print "Hello, World!"

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

output = "Hello, World!"

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

print output
Output

Hello, World!

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

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

数组

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

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

一个整数数组的样子是这样的:

[-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中,数组是可变的,这意味着你可以添加值,删除值甚至修改数组中的条目。

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

符号

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

:time_zone

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

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

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

散列

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

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

你可以像其他数据类型一样为变量分配哈希。

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

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

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

你可以使用符号作为散列中的键而不是字符串。

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 is an Integer
t = "Sammy" # t is a String
t = :sammy # t is a Symbol
t = true # t is a boolean (true)
t # t is nil

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

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

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

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

# Convert the amount to a 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"
Output

TypeError: String can’t be coerced into Integer

这段代码也会这样做。

print "5" + 5
Output

TypeError: no implicit conversion of Integer into String

如果你想将数字相加得到10,将字符串转换为整数。如果你想将它们连在一起得到”55″,将整数转换为字符串。

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

识别数据类型

在Ruby中,几乎所有东西都是一个对象。整数、浮点数、数组、符号和散列都是Ruby对象,并且它们都有一个叫做class的方法,可以告诉你它们的类型。即使布尔值true和false,以及值为空(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

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

# somewhere in the code...
sharks = ["Hammerhead", "Tiger", "Great White"]
...
# somewhere else...

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

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

结论 (jié

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

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

  • How to Work with Strings in Ruby
  • How to Work with Arrays in Ruby
  • How to Convert Data Types in Ruby
发表回复 0

Your email address will not be published. Required fields are marked *


广告
将在 10 秒后关闭
bannerAds