如何在Ruby中使用数组

来自菜鸟教程
跳转至:导航、​搜索

介绍

array 是一种数据结构,表示值列表,称为 elements。 数组允许您将多个值存储在单个变量中。 这可以压缩和组织您的代码,使其更具可读性和可维护性。 而且由于数组是具有自己方法的对象,因此可以更轻松地处理数据列表。

在红宝石。 数组可以包含任何数据类型,包括数字、字符串和其他 Ruby 对象。

让我们看一个简单的例子来说明数组有多强大。 想象一下,您必须维护一个电子邮件地址列表。 如果没有数组,您可能会将电子邮件地址存储在变量中,如下所示:

电子邮件.rb

email1 = "ceo@example.com"
email2 = "admin@example.com"
email3 = "support@example.com"
email4 = "sales@example.com"

这种方法很冗长,并且很快就会变得难以维护,因为它不是很灵活。 添加另一个电子邮件地址意味着您必须添加和跟踪一个附加变量。

如果使用数组,则可以简化此数据:

电子邮件.js

emails = [
  "ceo@example.com",
  "admin@example.com",
  "support@example.com",
  "sales@example.com"
]

您现在拥有一个包含所有四个电子邮件地址的变量,而不是创建五个单独的变量。 在此示例中,我们使用方括号 — [] — 创建一个数组,并用逗号分隔每个条目。 如果您必须添加一个额外的电子邮件地址,您将向数组中添加另一个电子邮件地址,而不是创建和管理一个新变量。

要访问特定项或数组的 element,请引用其 index 或其在数组中的位置。 在 Ruby 中,索引从零开始。 因此,为了从我们的 emails 数组中检索第一个元素,我们使用方括号将元素的索引附加到变量中,如下所示:

print emails[0];
Outputceo@example.com

在本教程中,您将创建数组、访问它们包含的值、添加、修改和删除数组中的元素,并遍历数组中的元素以解决更复杂的问题。 让我们从更详细地了解如何创建数组开始。

创建一个数组

要在 Ruby 程序中创建数组,请使用方括号:([]),并用逗号分隔要存储的值。

例如,创建一个鲨鱼数组并将其分配给一个变量,如下所示:

鲨鱼.rb

sharks = ["Hammerhead", "Great White", "Tiger"]

您可以使用 print 语句打印出整个数组,这将显示数组的内容:

print sharks
Output["Hammerhead", "Great White", "Tiger"] 

如果要创建一个每个条目都是一个单词的数组,可以使用 %w{} 语法,它创建一个 单词数组

days = %w{Monday Tuesday Wednesday Thursday Friday Saturday Sunday}

这等效于使用方括号创建数组:

days =  ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]

但是,请注意 %w{} 方法允许您跳过引号和逗号。

数组通常用于将相似数据类型的列表组合在一起,但在 Ruby 中,数组可以包含任何值或混合值,包括其他数组。 下面是一个包含字符串、nil 值、整数和字符串数组的数组示例:

混合数据.rb

record = [
    "Sammy",
    null,
    7,
    [
        "another",
        "array",
    ]
]

现在让我们看看我们如何访问存储在数组中的数据。

访问数组中的项目

您可以通过引用方括号中项目的 index 来访问 Ruby 数组中的项目。

让我们用分配给变量 sharks 的鲨鱼数组来探索这个概念:

鲨鱼.rb

sharks = ["Hammerhead", "Great White", "Tiger"]

sharks 数组包含三个元素。 以下是 sharks 数组中每个元素如何被索引的细分。

双髻鲨 大白 老虎
0 1 2

数组中的第一个元素是 Hammerhead,其索引为 0。 最后一个元素是 Tiger,其索引为 2。 计数从索引中的 0 开始,这违背了我们从 1 开始计数的自然直觉,所以你要记住这一点,直到它变得自然。

注意:将索引视为偏移量可能会有所帮助; 它是从数组开始的位置数。 第一个元素在开头,因此它的偏移量或索引是 0。 第二个元素与数组中的第一个条目相距一个点,因此它的偏移量或索引是 1


您可以使用 length 方法找出数组中有多少元素。

sharks.length
Output3

虽然 sharks 的索引从 0 开始并转到 2,但 length 属性返回数组中的元素个数,即 3。 它根本不关心指数。

如果要查找数组中特定元素的索引号,例如 seahorse,请使用 index() 方法:

print sharks.index("Tiger")
Output2

这将返回包含该文本的第一个元素的索引。 如果未找到索引号,例如对于不存在的值,控制台将返回 nil

print sharks.index("Whale")
Outputnil

要在 Ruby 中获取数组的最后一个元素,请使用索引 -1

print sharks[-1]
Output"Tiger"

Ruby 还提供了 firstlast 方法来获取第一个和最后一个元素,而无需使用索引:

puts sharks.first
puts sharks.last
Output"Hammerhead"
"Tiger"

尝试访问不存在的索引将返回 nil

sharks[10]
Outputnil

数组可以包含其他数组,我们称之为嵌套数组。 这是在程序中对二维数据集进行建模的一种方法。 下面是一个嵌套数组的示例:

nested_array = [
    [
        "salmon",
        "halibut",
    ],
    [
        "coral",
        "reef",
    ]
]

为了访问嵌套数组中的元素,您将添加另一个索引号以对应于内部数组。 例如,要从此嵌套数组中检索值 coral,您可以使用以下语句:

print nested_array[1][0];
Outputcoral

在这个例子中,我们访问了 nested_array 变量的 1 位置的数组,它返回了数组 ["coral", "reef"]。 然后我们访问了该数组的 0 位置的元素,即 "coral"

现在让我们看看如何将元素添加到数组中。

添加元素

我们的 sharks 数组中有三个元素,它们的索引从 02

鲨鱼.rb

sharks = ["Hammerhead", "Great White", "Tiger"]

有几种方法可以添加新元素。 您可以为下一个索引分配一个值,在本例中为 3

sharks[3] = "whale";

print sharks
Output["Hammerhead", "Great White", "Tiger", "Whale"] 

这种方法虽然容易出错。 如果你添加一个元素并且不小心跳过了一个索引,它会在数组中创建一个 nil 元素。

sharks[5] = "Sand";

print sharks;
Output["Hammerhead", "Great White", "Tiger", "Whale", nil, "Sand"]

尝试访问额外的数组元素将返回其值,即 nil

sharks[4]
Outputnil

在数组中查找下一个可用索引很容易出错并且需要额外的时间。 使用 push 方法避免错误,该方法将元素添加到数组的末尾:

sharks.push("thresher")
print sharks
Output["Hammerhead", "Great White", "Tiger", "Whale", nil, "Whale", "Thresher"]

您还可以使用 << 语法而不是 push 方法将元素添加到数组的末尾:

sharks << "Bullhead"
Output["Hammerhead", "Great White", "Tiger", "Whale", nil, "Whale", "Thresher", "Bullhead"]

要将元素添加到数组的开头,请使用 unshift() 方法:

sharks.unshift("Angel")
print sharks
Output["Angel", "Hammerhead", "Great White", "Tiger", "Whale", nil, "Whale", "Thresher", "Bullhead"]

既然您知道如何添加元素,那么让我们看看如何删除它们。

移除元素

要从数组中删除特定元素,请使用 deletedelete_at 方法。 在 sharks 数组中,我们之前不小心创建了一个 nil 数组元素。 让我们摆脱它。

首先,找到它在数组中的位置。 您可以使用 index 方法来做到这一点:

print sharks.index(nil)
Output4

然后使用 delete_at 删除索引 4 处的元素并打印数组:

sharks.delete_at(4)
print sharks
Output["Angel", "Hammerhead", "Great White", "Tiger", "Whale", "Thresher", "Bullhead"]

delete 方法从数组中删除与您传入的值匹配的元素。 使用它从数组中删除 Whale

sharks.delete("Whale")
print sharks;
Output["Angel", "Hammerhead", "Great White", "Tiger", "Thresher", "Bullhead"]

delete 方法将删除您传递的值的 all 出现,因此如果您的数组有重复元素,它们将全部被删除。

pop 方法将删除数组中的最后一个元素。

sharks.pop
print sharks;
Output["Angel", "Hammerhead", "Great White", "Tiger", "Thresher"]

Bullhead 作为数组的最后一个元素已被删除。 要删除数组的第一个元素,请使用 shift 方法。

sharks.shift
print sharks
Output["Hammerhead", "Great White", "Tiger", "Thresher"]

这一次,Angel 被从数组的开头移除。

通过使用 popshift,您可以从数组的开头和结尾删除元素。 尽可能使用 pop 是首选,因为数组中的其余项目保留其原始索引号。

delete_atpopshift 方法都会更改原始数组并返回您删除的元素。 试试这个例子:

鲨鱼.rb

sharks = ["Hammerhead", "Great White", "Tiger", "Whale"]
deleted_at_element = sharks.delete_at(1)
popped_element = sharks.pop

puts "Deleted_at element: #{deleted_at_element}"
puts "Popped element: #{popped_element}"

puts "Remaining array: #{sharks}"
OuptutDeleted_at element: Great White
Popped element: Whale
Remaining array: ["Hammerhead", "Tiger"]

您现在知道了几种从数组中删除元素的方法。 现在让我们看看如何修改我们已有的元素。

修改现有元素

要更新数组中的元素,请使用赋值运算符为元素的索引分配一个新值,就像使用常规变量一样。

给定一个新的鲨鱼数组,"Hammerhead" 在索引 0 处,让我们将 "Hammerhead" 替换为 "Angel"

sharks = ["Hammerhead", "Great White", "Tiger", "Whale"]
sharks[0] = "Angel"
print sharks;
Output["Angel", "Great White", "Tiger", "Whale"]

为了确保更新正确的元素,您可以使用 index 方法首先定位元素,就像您找到要删除的元素一样。

现在让我们看看如何处理数组中的所有元素。

遍历数组

Ruby 提供了许多迭代数组的方法,您使用的每种方法都取决于您要执行的工作类型。 在本文中,我们将探讨如何遍历数组并显示其中的每个元素。

Ruby 提供了 for..in 语法,如下所示:

sharks = ["Hammerhead", "Great White", "Tiger", "Whale"]
for shark in sharks do
  puts shark
end

这是它的工作原理。 对于 sharks 数组中的每个元素,Ruby 将该元素分配给局部变量 shark。 然后我们可以使用 puts 打印元素的值。

不过,您不会经常看到 for..in。 Ruby 数组是对象,它们提供了 each 方法来处理元素。 each 方法的工作方式与 for..in 类似,但语法不同:

每个.rb

sharks = ["Hammerhead", "Great White", "Tiger", "Whale"]
sharks.each do |shark| 
  puts shark
end

each 方法使用您在 Ruby 编程中经常看到的语法。 它以一个 Ruby 块作为参数。 block 是稍后将在方法上下文中执行的一些代码。 在这种情况下,代码为 puts shark。 括在管道字符 (|) 中的 shark 关键字是表示块将访问的数组中的元素的局部变量。 Ruby 将元素分配给该变量并执行块中的代码。 each 方法对数组中的每个元素重复此过程。 结果如下所示:

OutputHammerhead
Great White
Tiger
Whale

当块只有一行时,你经常会看到 Ruby 开发人员用花括号替换 doend 关键字,并将整个语句压缩成一行,如下所示:

每个.rb

...
sharks.each {|shark| puts shark }

这会产生相同的结果,但使用的代码行数更少。

each_with_index 方法以类似的方式工作,但它还允许您访问数组元素的索引。 该程序使用 each_with_index 打印出每个元素的索引和值:

each_with_index.rb

sharks = ["Hammerhead", "Great White", "Tiger", "Whale"]
sharks.each_with_index do |shark, index| 
  puts "The index is #{index}"
  puts "The value is #{shark}"
end

对于数组中的每个元素,Ruby 将元素分配给变量 shark,并将当前索引分配给 index 变量。 然后我们可以在块中引用这两个变量。

该程序的结果如下所示:

OutputThe index is 0
The value is Hammerhead
The index is 1
The value is Great White
The index is 2
The value is Tiger
The index is 3
The value is Whale

您将经常在自己的程序中对数组中的元素进行交互,例如当您需要在网站上显示数据库中的项目时,或者当您从文件中读取行并处理它们的内容时。

结论

数组是 Ruby 编程中极为通用的基本部分。 在本教程中,您创建了数组并访问了各个元素。 您还添加、删除和修改了数组中的元素。 最后,您探索了两种迭代数组并显示其内容的方法,这是显示数据的常用方法。

通过阅读教程 Understanding Data Types in Ruby 了解 Ruby 中的其他数据类型。