如何在Ruby中使用数组
引言
数组是一种数据结构,它表示一个称为元素的值列表。 数组允许您在一个变量中存储多个值。 在Ruby中,数组可以包含任何数据类型,包括数字,字符串和其他Ruby对象。 这可以压缩和组织您的代码,使其更易读和可维护。 所有数组都是具有自己的方法的对象,您可以调用这些方法,提供一种标准化处理数据集的方式。
在这个教程中,你将创建数组,访问它们包含的值,向数组中添加、修改和移除元素,并通过遍历数组中的元素来解决更复杂的问题。
创建一个数组
你将首先详细了解如何创建数组。以鲨鱼物种为例,以下是一个各种鲨鱼物种的列表。如果没有数组,你可能会将它们分别存储在不同的变量中。
shark1 = "Hammerhead"
shark2 = "Great White"
shark3 = "Tiger"
这种方法冗长且很快就变得难以维护,因为它不够灵活。 加入另一条鲨鱼意味着你需要添加和跟踪一个额外的变量。
如果你使用一个数组,你可以简化这个数据。在 Ruby 程序中创建一个数组,使用方括号([]),并用逗号分隔你想要存储的值。
sharks = ["Hammerhead", "Great White", "Tiger"]
不再创建三个单独的变量,而是现在有一个包含所有三只鲨鱼的变量。在这个例子中,你使用方括号([])创建了一个数组,并用逗号分隔每个条目。如果你需要添加另一只鲨鱼,你只需将其添加到数组中,而不是创建和管理一个新变量。
你可以使用打印语句来打印整个数组,它会显示数组的内容。
print sharks
[“Hammerhead”, “Great White”, “Tiger”]
如果你想创建一个每个元素都是单词的数组,你可以使用%w{}语法,它可以创建一个单词数组。
days = %w{Monday Tuesday Wednesday Thursday Friday Saturday Sunday}
这等同于使用方括号创建数组。
days = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
然而,请注意,%w{} 方法允许你省去引号和逗号。
数组经常被用来组合相似数据类型的列表,但在Ruby中,数组可以包含任何值或混合值,甚至包括其他数组。下面是一个包含字符串、空值、整数和字符串数组的示例数组。
record = [
"Sammy",
null,
7,
[
"another",
"array",
]
]
现在你将学习如何访问存储在数组中的数据。
访问数组中的项目
要访问数组的特定元素或项,您需要引用其索引或在数组中的位置。在Ruby中,索引从零开始。为了从你的鲨鱼数组中检索第一个元素,你需要使用方括号将元素的索引附加到变量上。
sharks = ["Hammerhead", "Great White", "Tiger"]
鲨鱼数组有三个元素。这里是鲨鱼数组中每个元素的索引方式解析。
Hammerhead | Great White | Tiger |
---|---|---|
0 | 1 | 2 |
数组的第一个元素是锤头鲨鱼,索引为0。最后一个元素是老虎,索引为2。在索引中,计数从0开始,这与从1开始计数的自然直觉相悖,因此在此之前要保持这个理念,直到它变得自然为止。
Note
你可以使用length方法来确定一个数组中有多少个元素。
sharks.length
3
尽管鲨鱼的索引从0开始,一直到2,但长度属性返回的是数组中元素的个数,即3个。它并不关心索引。
如果你想要找出数组中特定元素(如Tiger)的索引编号,使用index()方法即可。
print sharks.index("Tiger")
2
这会返回第一个包含文本的元素的索引。如果找不到索引号,例如对于不存在的值,控制台将返回nil。
print sharks.index("Whale")
nil
要获取数组中的最后一个元素,在Ruby中使用索引-1。
print sharks[-1]
“Tiger”
Ruby还提供了“first”和“last”方法,用于获取第一个和最后一个元素,而无需使用索引。
puts sharks.first
puts sharks.last
“Hammerhead” “Tiger”
尝试访问不存在的索引将返回空值。
sharks[10]
nil
数组可以包含其他数组,这些被称为嵌套数组。这是在程序中建模二维数据集的一种方式。以下是一个嵌套数组的示例:
nested_array = [
[
"salmon",
"halibut",
],
[
"coral",
"reef",
]
]
为了访问嵌套数组中的元素,您需要添加另一个索引号以对应内部数组。例如,要从这个嵌套数组中检索出coral的值,您可以使用以下语句:
print nested_array[1][0];
coral
在这个例子中,您访问了nested_array变量中位置1的数组,它返回了数组[“珊瑚”, “礁”]。然后,您访问了该数组在位置0的元素,它是”珊瑚”。
现在你将学习如何向数组添加元素。
给数组添加元素
你的鲨鱼数组中有三个元素,它们从0到2进行索引。
sharks = ["Hammerhead", "Great White", "Tiger"]
有几种方法可以添加一个新元素。您可以给下一个索引分配一个值,此处为3。
sharks[3] = "Whale";
print sharks
[“Hammerhead”, “Great White”, “Tiger”, “Whale”]
虽然这种方法容易出错。如果你添加一个元素时不小心跳过了一个索引,那么数组中就会创建一个空元素。
sharks[5] = "Sand";
print sharks;
[“Hammerhead”, “Great White”, “Tiger”, “Whale”, nil, “Sand”]
尝试访问额外的数组元素将返回其值,该值将为nil。
sharks[4]
nil
在数组中找到下一个可用的索引是容易出错且耗时的。可以通过使用push方法来避免错误,该方法将一个元素添加到数组的末尾。
sharks.push("Thresher")
print sharks
[“Hammerhead”, “Great White”, “Tiger”, “Whale”, nil, “Whale”, “Thresher”]
你还可以使用 “<< ” 语法将元素添加到数组的末尾,而不是使用 push 方法。
sharks << "Bullhead"
[“Hammerhead”, “Great White”, “Tiger”, “Whale”, nil, “Whale”, “Thresher”, “Bullhead”]
要在数组的开头添加一个元素,使用unshift()方法。
sharks.unshift("Angel")
print sharks
[“Angel”, “Hammerhead”, “Great White”, “Tiger”, “Whale”, nil, “Whale”, “Thresher”, “Bullhead”]
现在你知道如何添加元素了,接下来你将学习如何移除它们。
从数组中移除元素
从数组中删除特定元素,可以使用delete或delete_at方法。在之前创建的鲨鱼数组中,你创建了一个空的数组元素。现在,你将摆脱它。
首先,找到它在数组中的位置。您可以使用索引方法来完成这个任务。
print sharks.index(nil)
4
然后使用delete_at来删除索引为4的元素并打印数组。
sharks.delete_at(4)
print sharks
[“Angel”, “Hammerhead”, “Great White”, “Tiger”, “Whale”, “Thresher”, “Bullhead”]
使用delete方法从数组中删除与传入值匹配的元素。将其用于从数组中删除”Whale”。
sharks.delete("Whale")
print sharks;
[“Angel”, “Hammerhead”, “Great White”, “Tiger”, “Thresher”, “Bullhead”]
删除方法将删除您传递的所有值的所有出现,因此如果数组中有重复的元素,它们都将被删除。
pop方法将删除数组中的最后一个元素。
sharks.pop
print sharks;
[“Angel”, “Hammerhead”, “Great White”, “Tiger”, “Thresher”]
牛头已被移除作为数组的最后一个元素。为了移除数组的第一个元素,请使用shift方法。
sharks.shift
print sharks
[“Hammerhead”, “Great White”, “Tiger”, “Thresher”]
这一次,数组的开头位置移除了 Angel。
通过使用pop和shift,您可以从数组的开头和末尾删除元素。在尽可能的情况下,最好使用pop,因为数组中的其他项保留其原始索引编号。
删除元素时,delete_at、pop和shift方法都会改变原始数组,并返回你删除的元素。
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}"
Deleted_at element: Great White Popped element: Whale Remaining array: [“Hammerhead”, “Tiger”]
现在你已经知道了几种从数组中删除元素的方法。现在你将看看如何修改你已经拥有的元素。
修改数组中现有的元素
要更新数组中的元素,只需使用赋值运算符将新值赋给元素的索引,就像你对普通变量一样。
给定一个新的鲨鱼数组,其中索引为0的位置是“锤头鲨”,你将把它替换为“天使鲨”。
sharks = ["Hammerhead", "Great White", "Tiger", "Whale"]
sharks[0] = "Angel"
print sharks;
[“Angel”, “Great White”, “Tiger”, “Whale”]
为了确保你更新的是正确的元素,你可以先使用索引方法来定位元素,就像你在查找想要删除的元素时所做的一样。
现在你将会学习如何处理数组中的所有元素。
遍历数组
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 的工作方式类似,但语法不同。
sharks = ["Hammerhead", "Great White", "Tiger", "Whale"]
sharks.each do |shark|
puts shark
end
每个方法使用了在Ruby编程中经常看到的一种语法。它接受一个Ruby块作为参数。块是一些代码,将在方法的上下文中稍后执行。在这种情况下,代码是puts shark。shark关键字,使用竖线字符(|)括起来,是代表块将访问的数组中的元素的局部变量。Ruby将元素分配给这个变量,并在块中执行代码。每个方法重复这个过程,对数组中的每个元素都执行一次。
Hammerhead Great White Tiger Whale
当代码块只有一行时,你经常会看到Ruby开发者用花括号替换do和end关键字,并将整个语句压缩为一行。
...
sharks.each {|shark| puts shark }
这样可以得到相同的结果,但是使用的代码行数更少。
each_with_index方法的工作方式类似,但它还允许您访问数组元素的索引。此程序使用each_with_index方法打印出每个元素的索引和值。
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,并将当前索引赋给索引变量。然后,您可以在块中引用这两个变量。
The 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
在你自己的程序中,你经常需要遍历数组中的元素,比如当你需要在网页上显示数据库中的项目或者当你正在从文件中读取行并处理它们的内容。
结论 (jié
数组是Ruby编程中非常灵活和基础的部分。在本教程中,您创建了数组并访问了单个元素。您还向数组中添加、删除和修改了元素。最后,您探索了两种遍历数组并显示其内容的方法,这是一种常用的显示数据的方法。
通过阅读教程《理解 Ruby 中的数据类型》,了解 Ruby 中的其他数据类型。