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

当我们写出较大的数字时,我们倾向于使用逗号使它们更易于阅读。 例如,我们将 1,000,000 写成“一百万”。 您不能在代码中使用逗号,但 Ruby 允许您使用下划线 (_) 字符来使大数字更具可读性。

试试看:

large_number.rb

large_number = 1_234_567
print large_number

您将看到打印的整数不带下划线:

Output1234567

如果您必须在程序中表示大量数字,下划线可以让您编写更具可读性的代码。

随着您对 Ruby 语言的了解越来越多,您将有更多机会使用整数。 让我们看看如何处理 实数。

浮点数字

浮点数float 表示 实数 数。 实数可以是有理数也可以是无理数; 包含小数部分的数字,例如 9.0-116.42。 换句话说,Ruby 程序中的浮点数是一个包含小数点的数字。

你可以像打印整数一样在 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 中的布尔值。

布尔数据类型

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

数学中的许多运算为我们提供了评估结果为真或假的答案:

  • 大于
  • 少于
  • 等于


与数字一样,您可以将 truefalse 值存储在变量中:

result = 5 > 8

然后,您可以通过调用 print() 函数来打印布尔值:

print result

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

Outputfalse

随着您使用 Ruby 编写更多程序,您将更加熟悉布尔值的工作方式以及对 truefalse 求值的不同函数和操作如何改变程序的进程。

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

字符串

string 是一个或多个字符的序列,例如字母、数字和符号。 字符串主要存在于 Ruby 中的单引号 (') 或双引号 (") 中,因此要创建字符串,请将一系列字符括在引号中,如下所示:

"This is a string in double quotes."

简单的程序“Hello, World!”演示了如何在计算机编程中使用字符串,因为组成短语 Hello, World! 的字符是一个字符串。

print "Hello, World!"

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

output = "Hello, World!"

并通过调用变量打印出字符串:

print output
OutputHello, World!

像数字一样,我们可以在程序中对字符串执行许多操作,以操纵它们以实现我们正在寻求的结果。 字符串对于向用户传达信息以及用户将信息传达回程序很重要。

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

数组

array 可以在单个变量中保存多个值。 这意味着您可以在数组中包含值列表并遍历它们。 数组中的每个项目或值称为 元素

数组通过在方括号 [ ] 之间指定值来定义,用逗号分隔。

整数数组如下所示:

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

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

符号

symbol 是一种特殊的数据类型,其作用类似于 Ruby 程序中的标签或标识符。 符号是 不可变的,这意味着它们不能更改。 符号看起来像没有值的变量声明。 下面是一个符号示例:

:time_zone

在 Ruby 中,您通常使用符号来标识重要的内容,而您会使用字符串来表示需要使用或操作的文本。 Ruby 程序中的每个字符串都是其自己的对象,在内存中具有自己唯一的位置,即使字符串相同。

但是如果你多次引用同一个符号,你在程序中的任何地方都引用了同一个对象,这意味着你引用的是同一个内存位置。

当我们查看散列时,您将看到这个概念的实际作用,它可以让您将键与值相关联。

哈希

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

{"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 变量。

# 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"
OutputTypeError: String can't be coerced into Integer

这段代码也一样:

print "5" + 5
OutputTypeError: no implicit conversion of Integer into String

如果要将数字相加得到 10,请将字符串转换为整数。 如果要将它们连接在一起以获得 "55",请将 Integer 转换为 String。

动态类型提供了灵活性,但一个缺点是你不能总是确定你正在使用什么样的数据,因为变量可以包含任何可用的类型。 Ruby 为您提供了识别数据类型的方法。

识别数据类型

在 Ruby 中,几乎所有东西都是对象。 Integer、Float、Array、Symbol 和 Hash 都是 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

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

# 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

使用 classkind_of?is_a? 可以帮助您确保使用正确类型的数据。 随着您对 Ruby 的了解越来越多,您会发现处理数据的其他方法不涉及显式检查数据的类型。

结论

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

查看这些教程以继续探索 Ruby 的数据类型: