介绍
一个数组是表示值列表的数据结构,称为元素。数组允许您在单个变量中存储多个值。在Ruby中,数组可以包含任何数据类型,包括数字、字符串和其他Ruby对象。这可以使您的代码更简洁、有组织,并更易读和易于维护。所有数组都是具有自己可以调用的方法的对象,为使用数据集提供了一种标准化的方式。
在本教程中,您将创建数组,访问它们包含的值,在数组中添加、修改和删除元素,并遍历数组中的元素以解决更复杂的问题。
创建数组
您将首先详细了解如何创建数组。例如,这里是各种鲨鱼物种的列表。如果没有数组,您可能会将它们存储在单独的变量中:
shark1 = "Hammerhead"
shark2 = "Great White"
shark3 = "Tiger"
这种方法冗长,很快就变得难以维护,因为它不够灵活。添加另一个鲨鱼意味着您必须添加并跟踪另一个变量。
如果使用数组,您可以简化这些数据。要在Ruby程序中创建数组,请使用方括号:([]
),并用逗号分隔要存储的值:
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
值、整数和字符串数组的示例:
record = [
"Sammy",
null,
7,
[
"another",
"array",
]
]
现在您将学习如何访问存储在数组中的数据。
访问数组中的项目
为了访问特定项或数组的元素,您需要引用其索引或在数组中的位置。在Ruby中,索引从零开始。要检索sharks
数组的第一个元素,您需要将元素的索引附加到变量上,使用方括号:
sharks = ["Hammerhead", "Great White", "Tiger"]
sharks
数组有三个元素。以下是sharks
数组中每个元素的索引的详细说明。
Hammerhead | Great White | Tiger |
---|---|---|
0 | 1 | 2 |
数组中的第一个元素是Hammerhead
,其索引为0
。最后一个元素是Tiger
,其索引为2
。索引从0
开始计数,这与从1开始计数的直觉相悖,因此在变得自然之前,请记住这一点。
注意:将索引视为偏移量可能有助于您,意思是距离数组开头的位置数。第一个元素位于开头,因此其偏移量或索引为0
。第二个元素离数组的第一个条目有一个位置,因此其偏移量或索引为1
。
您可以使用length
方法查找数组中的元素数量:
sharks.length
Output3
尽管sharks
的索引从0
到2
,但length
属性返回数组中元素的数量,即3
。它根本不关心索引。
如果您想找出数组中特定元素的索引编号,例如Tiger
,请使用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
:
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
方法将移除传入值的所有出现,因此如果数组中有重复元素,它们都将被移除。
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
方法都会更改原始数组并返回已删除的元素:
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}"
OutputDeleted_at element: Great White
Popped element: Whale
Remaining array: ["Hammerhead", "Tiger"]
现在您已经了解了从数组中删除元素的几种方法。接下来,您将学习如何修改已有的元素。
修改数组中的现有元素
要更新数组中的元素,请使用赋值运算符为元素的索引分配新值,就像处理常规变量一样。
给定一个新的鲨鱼数组,其中"Hammerhead"
位于索引0
,你将用"Angel"
替换"Hammerhead"
:
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
,但语法不同:
sharks = ["Hammerhead", "Great White", "Tiger", "Whale"]
sharks.each do |shark|
puts shark
end
each
方法使用了在Ruby编程中经常见到的语法。它以一个Ruby块作为参数。一个块是一些稍后将在方法上下文中执行的代码。在这种情况下,代码是puts shark
。用竖线字符(|
)括起来的shark
关键字是表示块将访问的数组元素的局部变量。Ruby将元素分配给这个变量,并执行块中的代码。each
方法对数组中的每个元素重复这个过程:
OutputHammerhead
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
,并将当前索引分配给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 编程中非常灵活和基础的部分。在本教程中,您创建了数组并访问了各个元素。您还向数组中添加、移除和修改了元素。最后,您探索了两种迭代数组并显示其内容的方法,这是显示数据的常见方法之一。
通过阅读教程理解 Ruby 中的数据类型来了解 Ruby 中的其他数据类型。
Source:
https://www.digitalocean.com/community/tutorials/how-to-work-with-arrays-in-ruby