如何在Ruby中使用数组

介绍

一个数组是表示值列表的数据结构,称为元素。数组允许您在单个变量中存储多个值。在Ruby中,数组可以包含任何数据类型,包括数字、字符串和其他Ruby对象。这可以使您的代码更简洁、有组织,并更易读和易于维护。所有数组都是具有自己可以调用的方法的对象,为使用数据集提供了一种标准化的方式。

在本教程中,您将创建数组,访问它们包含的值,在数组中添加、修改和删除元素,并遍历数组中的元素以解决更复杂的问题。

创建数组

您将首先详细了解如何创建数组。例如,这里是各种鲨鱼物种的列表。如果没有数组,您可能会将它们存储在单独的变量中:

sharks.rb
shark1 = "Hammerhead"
shark2 = "Great White"
shark3 = "Tiger"

这种方法冗长,很快就变得难以维护,因为它不够灵活。添加另一个鲨鱼意味着您必须添加并跟踪另一个变量。

如果使用数组,您可以简化这些数据。要在Ruby程序中创建数组,请使用方括号:([]),并用逗号分隔要存储的值:

sharks.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值、整数和字符串数组的示例:

mixed_data.rb
record = [
    "Sammy",
    null,
    7,
    [
        "another",
        "array",
    ]
]

现在您将学习如何访问存储在数组中的数据。

访问数组中的项目

为了访问特定项或数组的元素,您需要引用其索引或在数组中的位置。在Ruby中,索引从零开始。要检索sharks数组的第一个元素,您需要将元素的索引附加到变量上,使用方括号:

sharks.rb
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
Output
3

尽管sharks的索引从02,但length属性返回数组中元素的数量,即3。它根本不关心索引。

如果您想找出数组中特定元素的索引编号,例如Tiger,请使用index()方法:

print sharks.index("Tiger")
Output
2

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

print sharks.index("Whale")
Output
nil

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

print sharks[-1]
Output
"Tiger"

Ruby还提供了firstlast方法,可以在不使用索引的情况下获取第一个和最后一个元素:

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

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

sharks[10]
Output
nil

数组可以包含其他数组,这称为嵌套数组。这是在程序中建模二维数据集的一种方式。这是一个嵌套数组的例子:

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

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

print nested_array[1][0];
Output
coral

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

现在您将学习如何向数组中添加元素。

向数组中添加元素

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

sharks.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]
Output
nil

通过使用 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)
Output
4

然后使用 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 从数组开头被移除。

通过使用 popshift,您可以从数组的开头和结尾移除元素。在可能的情况下,推荐使用 pop,因为数组中的其余项目保留其原始索引编号。

delete_atpopshift 方法都会更改原始数组并返回已删除的元素:

sharks.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}"
Output
Deleted_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,但语法不同:

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

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

Output
Hammerhead Great White Tiger Whale

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

each.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变量。然后你可以在块中引用这两个变量。

Output
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

你会经常在自己的程序中遍历数组中的元素,比如当你需要在网站上显示数据库中的项目时,或者当你从文件中读取行并处理它们的内容时。

结论

数组是 Ruby 编程中非常灵活和基础的部分。在本教程中,您创建了数组并访问了各个元素。您还向数组中添加、移除和修改了元素。最后,您探索了两种迭代数组并显示其内容的方法,这是显示数据的常见方法之一。

通过阅读教程理解 Ruby 中的数据类型来了解 Ruby 中的其他数据类型。

Source:
https://www.digitalocean.com/community/tutorials/how-to-work-with-arrays-in-ruby