分类
文章

理解ruby中的数据类型

介绍

编写程序时,可以使用data types对数据进行分类。数据类型告诉计算机如何处理程序中的数据。它们还确定您可以对数据执行的操作,包括可以执行的操作。

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

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

5 + π

我们可以保留方程作为解释无理数的答案,也可以将π舍入为带有小数位数的数字,然后将这些数字加在一起:

5 + π = 5 + 3.14 = 8.14

但是,如果我们尝试使用其他数据类型(例如单词)来评估数字,那么事情就会变得没有意义了。我们如何解决以下等式?

sky + 8

这不是我们立即知道如何解决的问题。由于数据是两种不同的类型,所以计算机也不能。”天空”是一个单词,而8是整数。在编写程序时,我们必须注意如何分配值以及如何通过加,减,乘和其他运算来操作它们。

在本教程中,您将学习Ruby固有的最重要的数据类型:整数,浮点数,字符串,符号,数组和哈希。这不是对数据类型的详尽研究,但是它将帮助您熟悉程序中可用的选项。

然后,您将探索dynamic typing 。Ruby程序根据变量包含的内容确定数据类型,因此了解动态类型的工作方式将有助于您避免自己程序中的棘手情况。并且由于变量可以包含任何值,因此您将学习识别变量的数据类型。

让我们开始看看如何在Ruby中处理整数。

整数

像数学, integers在计算机编程全是数字,可以是正数,负数,或者0(…, -101 ,…)。整数通常也称为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语言的更多了解,您将有更多的机会使用整数。让我们看看如何处理real numbers.

浮点数字

floating-point numberfloat表示real数。实数可以是有理数或无理数;包含小数部分的数字,例如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表示此数据类型。

数学中的许多运算都可以为我们提供答案,判断结果是否为真:

  • 比…更棒
    • 500> 100 true
    • 1> 5 false
  • 少于
    • 200 <400 true
    • 4 <2 false
  • 等于
    • 5 = 5 true
    • 500 = 400 false

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

result = 5 > 8

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

print result

由于5不大于8,因此您会看到以下结果:

Outputfalse

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

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

Strings

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

"This is a string in double quotes."

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

print "Hello, World!"

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

output = "Hello, World!"

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

print output
OutputHello, World!

像数字一样,我们可以对程序中的字符串执行许多操作,以便对其进行操作以实现我们所寻求的结果。字符串对于将信息传递给用户以及将信息传递回程序很重要。

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

Arrays

array可以在单个变量中保存多个值。这意味着您可以在数组中包含一个值列表并对其进行迭代。数组内部的每个项目或值都称为一个element

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

整数数组如下所示:

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

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

Symbols

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

:time_zone

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

但是,如果多次引用相同的符号,则意味着程序中各处都引用相同的对象,这意味着您引用的是相同的内存位置。

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

Hashes

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如何使用这些类型。

Dynamic Typing

在Ruby中,在分配值之前,您无需显式声明数据类型。分配值确定数据类型。Ruby使用dynamic typing ,这意味着类型检查是在运行时而不是在编译时完成的,就像使用static typing语言一样。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方法将String转换为Float。Ruby还提供了to_i方法来将String转换为Integers,并且大多数对象都可以使用to_s方法转换为String:

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 ,请将String转换为整数。如果要将它们连接在一起以获得"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?的作用相同kind_of? 但是对于某些开发人员来说可能更容易阅读:

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

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

结论

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

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

发表评论

电子邮件地址不会被公开。 必填项已用*标注