如何在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 还提供了 first
和 last
方法来获取第一个和最后一个元素,而无需使用索引:
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
数组中有三个元素,它们的索引从 0
到 2
:
鲨鱼.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"]
既然您知道如何添加元素,那么让我们看看如何删除它们。
移除元素
要从数组中删除特定元素,请使用 delete
或 delete_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
被从数组的开头移除。
通过使用 pop
和 shift
,您可以从数组的开头和结尾删除元素。 尽可能使用 pop
是首选,因为数组中的其余项目保留其原始索引号。
delete_at
、pop
和 shift
方法都会更改原始数组并返回您删除的元素。 试试这个例子:
鲨鱼.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 开发人员用花括号替换 do
和 end
关键字,并将整个语句压缩成一行,如下所示:
每个.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 中的其他数据类型。