了解 Ruby 中的数据类型

介绍

当您编写程序时,您使用 data types 来分类数据. 数据类型告诉计算机如何处理程序中的数据。

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

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

15 + π

我们可以把方程式作为答案来计算非理数,或者我们可以将 π 围绕到一个有短数十位数的数字上,然后将数字加在一起:

15 + π = 5 + 3.14 = 8.14

但是,如果我们试图用另一种数据类型来评估数字,例如单词,事情就会变得不那么有意义。

1sky + 8

这不是我们立即知道如何解决的问题,计算机也不能解决问题,因为数据是两种不同的类型,天空是一个词,而8是一个整数,当我们写程序时,我们必须小心我们如何分配值,以及我们如何通过增量,减去,倍增等操作来操纵它们。

在本教程中,您将了解 Ruby 原生最重要的数据类型:整数,浮点,字符串,符号,数组和哈希. 这不是对数据类型的全面调查,但它将帮助您熟悉您在程序中可用的选项。

然后,您将探索 dynamic typing. Ruby 程序根据变量中包含的数据类型来确定数据类型,因此了解动态打字如何工作将有助于您在自己的程序中避免困难的情况,并且由于变量可以包含任何值,您将学习识别变量的数据类型。

让我们先来看看如何在Ruby中使用整数。

整合者

与数学一样,计算机编程中的整数是可以是正数、负数或0(..., -1, 0, 1,...)的整数。

你可以这样打印一个整数:

1print -25
1[secondary_label Output]
2-25

您还可以将整数存储在变量中,然后通过引用变量来打印该值:

1my_int = -25
2print my_int
1[secondary_label Output]
2-25

您也可以用整数做数学,例如,您可以计算两个数字的总和并打印结果:

1sum = 116 - 68
2print sum
1[secondary_label Output]
248

当我们写出更大的数字时,我们倾向于使用字符串来使它们更容易读取,例如,我们会写一百万一百万

试试一下吧:

1[label large_number.rb]
2large_number = 1_234_567
3print large_number

您将看到打印的整数没有底点:

1[secondary_label Output]
21234567

标签允许你写出更易读的代码,如果你需要在你的程序中代表大的数字。

随着您了解 Ruby 语言的更多信息,您将有更多机会使用整数工作,让我们看看如何使用 _real 数字。

浮动点数

一个 _floating-point 数字或一个 float 数字代表一个 real 数字. 实际数字可以是理性的或非理性的数字;包含一部分的数字,如 9.0116.42

您可以在 Ruby 中打印浮点,就像您打印整数一样:

1print 17.3
1[secondary_label Output]
217.3

您还可以声明变量并分配一个浮动:

1my_float = 17.3
2print my_float
1[secondary_label Output]
217.3

和整数一样,你也可以用Ruby中的浮点来做数学:

1sum = 564.0 + 365.24
2print sum
1[secondary_label Output]
2929.24

如果您在 Ruby 中将 float 添加到整数中,您将得到一个 float:

1sum = 564 + 365.24
2print sum
1[secondary_label Output]
2929.24

Ruby 将任何没有十进制写的数字视为整数(如138)和任何用十进制写的数字视为浮点(如138.0).

接下来,让我们看看 Ruby 中的 Booleans。

布尔数据类型

Boolean 用于表示与数学逻辑分支相关的真理值,该分支为计算机科学中的算法提供信息。

数学中的许多操作给了我们评估为真或假的答案:

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

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

1result = 5 > 8

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

1print result

由于5不大于8,你会看到以下结果:

1[secondary_label Output]
2false

随着您在 Ruby 中编写更多的程序,您将更加熟悉布尔语的运作方式,以及如何将不同的函数和操作评估为可以改变程序的进程。

接下来,让我们探索在我们的程序中使用文本的工作。

严格

一个 string 是一个或多个字符的序列,如字母,数字和符号. 序列主要存在于 Ruby 中的单个引文(``)或双引文("),所以要创建一个字符串,请在引文中包含一个字符序列,如下:

1"This is a string in double quotes."

小程序[Hello, World!](https://andsky.com/tech/tutorials/how-to-write-your-first-ruby-program)展示了如何在计算机编程中使用字符串,因为构成Hello, World!的字符是字符串。

1print "Hello, World!"

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

1output = "Hello, World!"

然后通过调用变量来打印字符串:

1print output
1[secondary_label Output]
2Hello, World!

就像数字一样,我们可以在程序中对字符串进行许多操作,以便操纵它们以达到我们正在寻找的结果。

有时你需要与数据列表一起工作,这就是数组方便的地方。

拉拉斯

一个 array 可以包含单个变量中的多个值,这意味着你可以包含一个数组中的值列表,并通过它们迭代。

数组是通过指定字符串隔离的[ ]方块之间的值来定义的。

整数的数组看起来像这样:

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

一系列的浮动看起来像这样:

1[3.14, 9.23, 111.11, 312.12, 1.05]

以下是 Strings 的列表:

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

与其他数据类型一样,您可以将数组分配给变量:

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

如果我们打印变量,输出看起来就像我们创建的数组:

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

您可以使用指数号访问数组中的单个元素,从0开始。

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

要打印最后一个值,您可以使用索引 -1. Ruby 还提供 .firstlast 方法来抓住第一个和最后一个输入,分别:

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

Ruby 中的数组可以包含许多不同类型的数据,您可以在数组中存储字符串、符号甚至其他数组:

1record = [
2:en,
3"Sammy",
442,
5[
6"coral",
7"reef"
8]
9]

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

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

象征

一个 symbol 是一个特殊的数据类型,在 Ruby 程序中作为标签或标识符的作用. 符号是 immutable,这意味着它们不能更改. 一个符号看起来像一个没有值的变量声明。

1:time_zone

在Ruby中,你通常会使用一个符号来识别一些重要的东西,而你会使用一个字符串来描述你需要处理或操纵的文本。

但是,如果您多次引用相同的符号,则在程序中的每个地方都引用相同的对象,这意味着您正在引用相同的内存位置。

您将看到这个概念在行动中,当我们看看哈希,这允许您将密钥与值联系起来。

哈希

一个 hash 是一个字典类似的密钥和值组合。这些密钥值对提供了存储和访问数据的有用方法。 密码通常用于存储相关的数据,例如有关用户的信息。

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

您可以将哈希分配给变量,就像其他数据类型一样:

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

要从用户哈希中获取值,您可以使用该值的密钥:

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

您可以使用符号作为哈希中的密钥,而不是字符串:

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

使用符号作为哈希密钥是优先的,只要可能. 符号的每个实例都指向相同的对象,而字符串的每个实例都指向一个独特的对象。

当您使用符号作为密钥时,您使用符号来检索值:

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

您也可以在定义哈希时使用略有不同的语法:

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

这个语法类似于JavaScript和其他语言中使用的语法,该语法将密钥定义为符号,因此您可以使用:first_name:last_name而不是first_namelast_name字符串访问条目。

您已经查看了几种数据类型,所以让我们看看Ruby如何使用这些类型。

动态打字

在 Ruby 中,在分配一个值之前,您不会明确声明数据类型;分配该值决定了数据类型。Ruby 使用 dynamic typing,这意味着类型检查在运行时进行,而不是编译时间,就像使用 static typing 的语言一样。

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

1t = 42 # t is an Integer
2t = "Sammy" # t is a String
3t = :sammy # t is a Symbol
4t = true # t is a boolean (true)
5t # t is nil

使用动态键入语言,您可以重新使用现有变量来存储不同的数据类型。

这在将数据从一种类型转换为另一种类型时是有用的,例如,您可能有这个代码,该代码要求用户提供一个数字值:

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

您从键盘中获取的数据总是一个字符串,所以为了进行数学操作,您必须将长度变量的数据转换为一个数字. 在静态键入的语言中,在您可以分配一个值之前,您必须声明变量的数据类型,您需要一个新的变量来保持转换的数据。

1# Convert the amount to a Float.
2length = length.to_f

Ruby 还提供to_i 方法来将字符串转换为整数,并且大多数对象可以使用to_s 方法转换为字符串:

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

Ruby 是动态键入的,但它不允许您在不将它们转换为相同类型的数据上执行操作,例如,此代码会导致错误:

1print 5 + "5"
1[secondary_label Output]
2TypeError: String can't be coerced into Integer

正如这个代码:

1print "5" + 5
1[secondary_label Output]
2TypeError: no implicit conversion of Integer into String

如果你想将数字加在一起以获得10,转换字符串为整数. 如果你想将它们连接在一起以获得55,转换字符串为整数。

动态打字提供了灵活性,但一个缺点是,您不能总是确定您正在处理的数据类型,因为变量可以包含任何可用的类型。

识别数据类型

在 Ruby 中,几乎一切都是一个对象. 整数、浮量、数组、符号和哈希都是 Ruby 对象,它们都有一个叫做的方法,它会告诉你它们的类型。

142.class # Integer
2(42.2).class # Float
3["Sammy", "Shark"].class # Array
4true.class # TrueClass
5nil.class # NilClass

此外,您可以使用 kind_of? 方法来验证某种类型的数据,例如:

142.kind_of?(Integer) # true

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

1# somewhere in the code...
2sharks = ["Hammerhead", "Tiger", "Great White"]
3...
4# somewhere else...
5
6sharks.kind_of?(Hash) # false
7sharks.kind_of?(Array) # true

您还可以使用此方法来验证来自外部源的数据是否正确:

1if data.kind_of? String
2data = data.to_f
3end

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

1if data.is_a? String
2data = data.to_f
3end

使用「class」、「kind_of?」和「is_a?」可以幫助您確保您正在使用正確的資料類型。

结论

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

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

Published At
Categories with 技术
Tagged with
comments powered by Disqus