介绍
在编写程序时,您使用数据类型对数据进行分类。数据类型告诉计算机如何处理程序中的数据。它们还确定您可以对数据执行哪些操作,包括可以执行哪些操作。
思考数据类型的一种方式是考虑我们在现实世界中使用的不同类型的数据。例如,我们使用整数(0, 1, 2, …)、整数(…, -1, 0, 1, …)和无理数(π)。
通常,在数学中,我们可以组合来自不同类型的数字,并得到某种答案。例如,我们可能想将5加到π:
5 + π
我们可以将方程保留为答案,以考虑无理数,或者我们可以将π四舍五入为小数点位数较少的数字,然后将数字相加:
5 + π = 5 + 3.14 = 8.14
但是,如果我们尝试评估具有另一种数据类型的数字,例如单词,事情开始变得不那么合理。我们如何解决以下方程?
sky + 8
这不是我们立即知道如何解决的事情。计算机也不能,因为数据是两种不同类型的。”Sky”是一个单词,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
Output48
当我们写大数时,我们倾向于使用逗号使其更易读。例如,我们会写`1,000,000`来表示“一百万”。在编码中不能使用逗号,但Ruby允许您使用下划线`_`字符使大数字更易读。
试试看:
large_number = 1_234_567
print large_number
您将看到整数打印时没有下划线:
Output1234567
如果您需要在程序中表示大数,下划线可让您编写更易读的代码。
随着您对Ruby语言的了解越来越深入,您将有更多机会使用整数。让我们看看如何处理实数。
浮点数
A floating-point number or a float represents a real number. Real numbers can be either a rational or an irrational number; numbers that contain a fractional part, such as 9.0
or -116.42
. In other words, a float in a Ruby program is a number that contains a decimal point.
您可以像打印整数一样在Ruby中打印浮点数:
print 17.3
Output17.3
您还可以声明一个变量并赋一个浮点数:
my_float = 17.3
print my_float
Output17.3
并且,就像整数一样,您也可以在Ruby中对浮点数进行数学运算:
sum = 564.0 + 365.24
print sum
Output929.24
如果您在Ruby中将浮点数加到整数中,您将得到一个浮点数:
sum = 564 + 365.24
print sum
Output929.24
Ruby将任何没有小数点的数字视为整数(如`138`),将任何带有小数点的数字视为浮点数(如`138.0`)。
接下来,让我们看看Ruby中的布尔值。
布尔数据类型
布尔值用于表示与数学逻辑分支相关的真值,这影响计算机科学中的算法。在Ruby中,我们用两个值之一来表示这种数据类型,要么是true
,要么是false
。
数学中的许多操作给出的答案要么为true,要么为false:
- 大于
- 500 > 100
true
- 1 > 5
false
- 小于
- 200 < 400
true
- 4 < 2
false
- 等于
- 5 = 5
true
- 500 = 400
false
与数字一样,你可以将true
或false
的值存储在一个变量中:
result = 5 > 8
然后,你可以通过调用print()
函数打印布尔值:
print result
由于5不大于8,你将看到以下结果:
Outputfalse
随着你在Ruby中编写更多的程序,你将更熟悉布尔值的工作原理,以及不同的函数和操作如何评估为true
或false
可以改变程序的执行路径。
接下来,让我们探讨在我们的程序中处理文本。
字符串
A string is a sequence of one or more characters, such as letters, numbers, and symbols. Strings primarily exist within either single quotes ('
) or double quotes ("
) in Ruby, so to create a string, enclose a sequence of characters in quotes, like this:
"This is a string in double quotes."
小程序“你好,世界!”演示了字符串如何在计算机编程中使用,因为构成短语你好,世界!
的字符是一个字符串。
print "Hello, World!"
与其他数据类型一样,您可以将字符串存储在变量中:
output = "Hello, World!"
并通过调用变量打印字符串:
print output
OutputHello, World!
与数字一样,在程序中有许多操作可以对字符串执行,以便操纵它们以达到我们所寻求的结果。字符串对于向用户传达信息以及用户向程序传达信息都很重要。
有时您需要处理数据列表。这就是数组发挥作用的地方。
数组
一个数组可以在单个变量中存储多个值。这意味着您可以在数组中包含一系列值并对其进行迭代。数组中每个项目或值称为一个元素。
数组由方括号[ ]
之间的值定义,用逗号分隔。
一个整数数组看起来是这样的:
[-3, -2, -1, 0, 1, 2, 3]
A array of floats looks like this:
[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中的数组是可变的,这意味着您可以添加值、删除值,甚至修改数组中的条目。
有时我们需要一种在程序中标记事物的方法。这就是符号的作用。
符号
A symbol is a special data type that acts like a label or an identifier in a Ruby program. Symbols are immutable, which means that they cannot be changed. A symbol looks like a variable declaration without a value. Here’s an example of a symbol:
:time_zone
在Ruby中,通常使用符号来标识重要的内容,而对于需要处理或操作的文本,则使用字符串。Ruby程序中的每个字符串都是其自己的对象,具有独特的内存位置,即使字符串内容相同。
但是,如果您多次引用相同的符号,则在程序的任何位置引用的都是同一个对象,这意味着您引用的是相同的内存位置。
当我们查看哈希时,您将看到这个概念的实际应用,哈希允许您将键与值关联。
哈希
A hash is a dictionary-like collection of keys and values. These key-value pairs provide a useful way to store and access data. Hashes are often used to hold data that are related, such as the information about a user. You define a hash like this:
{"first_name" => "Sammy", "last_name" => "Shark"}
您可以像其他数据类型一样将哈希分配给变量:
user = {"first_name" => "Sammy", "last_name" => "Shark"}
要从user
哈希中检索值,您使用值的键:
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
从键盘获取的数据始终是一个字符串,所以为了进行数学运算,您必须将length
变量的数据转换为数字。在静态类型语言中,您必须在分配值之前声明变量的数据类型,因此您需要一个新变量来保存转换后的数据。但在Ruby中,由于它是动态类型的,您可以重复使用length
变量,如果您愿意的话。
# 将金额转换为浮点数。
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"
OutputTypeError: String can't be coerced into Integer
这段代码也会:
print "5" + 5
OutputTypeError: no implicit conversion of Integer into String
如果要将数字相加以获得10
,请将字符串转换为整数。如果要将它们连接在一起以获得"55"
,请将整数转换为字符串。
动态类型提供了灵活性,但缺点是您无法始终确定正在处理的是什么类型的数据,因为变量可以包含任何可用类型。Ruby提供了一些方法来确定数据的类型。
识别数据类型
在Ruby中,几乎所有东西都是对象。整数、浮点数、数组、符号和哈希都是Ruby对象,它们都有一个名为class
的方法,可以告诉你它们的类型。甚至布尔值true
和false
,以及值nil
都是对象。自己试一试:
42.class # 整数
(42.2).class # 浮点数
["Sammy", "Shark"].class # 数组
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
使用class
、kind_of?
和is_a?
可以帮助您确保正在处理正确类型的数据。随着对Ruby的深入了解,您将发现处理数据的其他方法,而无需显式检查数据类型。
结论
在Ruby程序中,您将使用许多不同的数据类型。您现在对Ruby程序中可用的主要数据类型有了更好的了解。
查看这些教程,以继续探索Ruby的数据类型:
Source:
https://www.digitalocean.com/community/tutorials/understanding-data-types-in-ruby