如何在 Ruby 中使用数组

介绍

一个 array 是一个代表一个值列表的数据结构,称为 elements。 Arrays 允许您在单个变量中存储多个值。在 Ruby 中,数组可以包含任何数据类型,包括数字,字符串和其他 Ruby 对象。

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

创建一个 Array

您将首先看看如何更详细地创建数组。作为一个例子,这里有各种鲨鱼物种的列表。

1[label sharks.rb]
2shark1 = "Hammerhead"
3shark2 = "Great White"
4shark3 = "Tiger"

这种方法很简单,而且很难维护,因为它不太灵活,添加另一个鲨鱼意味着你必须添加并跟踪一个额外的变量。

若要在 Ruby 程序中创建一个数组,请使用字段: ([]),并将您要存储的值与字段分开:

1[label sharks.rb]
2sharks = ["Hammerhead", "Great White", "Tiger"]

不是创建三个单独的变量,你现在有一个变量,其中包含所有三个鲨鱼. 在本示例中,你使用了方块(‘[]’)来创建一个数组,并将每个条目分开一个字符串。

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

1print sharks
1[secondary_label Output]
2["Hammerhead", "Great White", "Tiger"]

如果您想要创建一个每个条目为单个单词的数组,您可以使用 %w{} 语法,从而创建一个 word array:

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

这相当于创建方块的数组:

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

但是,请注意,%w{}方法允许您跳过报价和字符串。

数组通常用于组合类似数据类型的列表,但在 Ruby 中,数组可以包含任何值或值组合。

 1[label mixed_data.rb]
 2record = [
 3    "Sammy",
 4    null,
 5    7,
 6    [
 7        "another",
 8        "array",
 9    ]
10]

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

在 Arrays 中访问项目

要访问一个特定的项目,或一个数组的 element,你可以引用其 index,或在数组中的位置. 在 Ruby 中,索引从零开始。

1[label sharks.rb]
2sharks = ["Hammerhead", "Great White", "Tiger"]

鲨鱼数组有三个元素. 以下是鲨鱼数组中的每个元素的索引。

HammerheadGreat WhiteTiger
012

数组中的第一个元素是Hammerhead,该元素被索引为0。最后一个元素是Tiger,该元素被索引为2

<$>[注] :这可能有助于您将索引视为抵消,这意味着从数组开始的位置数量。第一个元素在开始,所以它的抵消,或索引,是 0。第二个元素距离数组中的第一个输入,所以它的抵消,或索引,是 1. <$>

您可以通过长度方法来确定数组中有多少元素:

1sharks.length
1[secondary_label Output]
23

虽然鲨鱼的索引从0开始,到2,但长度属性返回数组中的元素数目,即3

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

1print sharks.index("Tiger")
1[secondary_label Output]
22

如果没有找到索引号,例如对于不存在的值,控制台将返回:

1print sharks.index("Whale")
1[secondary_label Output]
2nil

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

1print sharks[-1]
1[secondary_label Output]
2"Tiger"

Ruby 还提供第一最后方法,以获取没有使用索引的第一和最后元素:

1puts sharks.first
2puts sharks.last
1[secondary_label Output]
2"Hammerhead"
3"Tiger"

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

1sharks[10]
1[secondary_label Output]
2nil

数组可以包含其他数组,这些数组被称为 nested array. 这是在程序中建模两维数据集的一种方式。

 1nested_array = [
 2    [
 3        "salmon",
 4        "halibut",
 5    ],
 6    [
 7        "coral",
 8        "reef",
 9    ]
10]

要访问嵌入式数组中的元素,您会添加另一个索引号码来匹配内部数组,例如,要从这个嵌入式数组中获取值珊瑚,您会使用以下语句:

1print nested_array[1][0];
1[secondary_label Output]
2coral

在本示例中,您访问了nested_array变量的1位置的数组,该数组返回了[珊瑚,reef]数组,然后您访问了该数组的0位置的元素,该数组是``珊瑚`。

现在,您将看看如何将元素添加到一个数组中。

将元素添加到 Arrays

你在你的鲨鱼系列中有三个元素,这些元素从02进行索引:

1[label sharks.rb]
2sharks = ["Hammerhead", "Great White", "Tiger"]

您可以将值分配给下一个索引,在这种情况下将是3:

1sharks[3] = "Whale";
2
3print sharks
1[secondary_label Output]
2["Hammerhead", "Great White", "Tiger", "Whale"]

如果你添加一个元素并意外跳过一个索引,它将在数组中创建一个元素。

1sharks[5] = "Sand";
2
3print sharks;
1[secondary_label Output]
2["Hammerhead", "Great White", "Tiger", "Whale", nil, "Sand"]

尝试访问额外的数组元素将返回其值,该值将为:

1sharks[4]
1[secondary_label Output]
2nil

在一个数组中找到下一个可用的索引容易出现错误,需要额外的时间. 通过使用方法来避免错误,该方法将一个元素添加到数组的末尾:

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

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

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

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

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

现在你知道如何添加元素,你会考虑删除它们。

从 Arrays 删除元素

要从数组中删除特定元素,请使用删除删除_at方法。在鲨鱼数组中,您早些时候创建了一个数组元素。

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

1print sharks.index(nil)
1[secondary_label Output]
24

然后使用delete_at删除指数4中的元素并打印数组:

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

删除方法将从数组中删除与您传输的值相匹配的元素. 使用它从数组中删除鲸鱼:

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

删除方法会删除您传输的值中的 all 发生,所以如果您的数组有重复元素,则所有元素都将被删除。

pop方法会删除数组中的最后一个元素:

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

「Bullhead」已被移除為數列的最後元素. 若要移除數列的第一個元素,請使用「shift」方法:

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

这一次,天使被从数组的开始删除。

通过使用popshift,您可以从序列的开始和结束中删除元素,最好在可能的情况下使用pop,因为序列中的其他元素保留原始索引号。

所有删除_at Pop Shift 方法都会更改原始数组,并返回您删除的元素:

1[label sharks.rb]
2sharks = ["Hammerhead", "Great White", "Tiger", "Whale"]
3deleted_at_element = sharks.delete_at(1)
4popped_element = sharks.pop
5
6puts "Deleted_at element: #{deleted_at_element}"
7puts "Popped element: #{popped_element}"
8
9puts "Remaining array: #{sharks}"
1[secondary_label Output]
2Deleted_at element: Great White
3Popped element: Whale
4Remaining array: ["Hammerhead", "Tiger"]

您现在知道从数组中删除元素的几种方法,现在您将查看如何更改您已经拥有的元素。

在 Arrays 中更改现有元素

若要更新数组中的一个元素,请使用分配运算器将新值分配给该元素的索引,就像您使用常规变量一样。

考虑到新的鲨鱼系列,在Hammerhead指数为0,你将Hammerhead替换为Angel:

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

要确保您更新正确的元素,您可以使用索引方法先查找元素,就像您查找想要删除的元素一样。

现在,您将看看如何与阵列中的所有元素一起工作。

超越 Arrays

Ruby 提供了许多方法来重复数组,您使用的每个方法取决于您想要执行的工作类型。

Ruby 提供「for..in」语法:

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

对于鲨鱼数组中的每个元素,Ruby 将该元素分配给本地变量鲨鱼

虽然你不会经常看到for..in。Ruby数组是对象,它们提供了每个方法来处理元素,每个方法与for..in相似,但具有不同的语法:

1[label each.rb]
2sharks = ["Hammerhead", "Great White", "Tiger", "Whale"]
3sharks.each do |shark|
4  puts shark
5end

每一种方法使用你在Ruby编程中经常看到的语法。它使用Ruby块作为其论点。 _block_是一种在方法的背景下以后执行的代码。在这种情况下,代码是puts shark。在管道字符中包含的shark的关键字是代表块将访问的数组中的元素的本地变量。Ruby将元素分配给该变量并在块中执行代码。

1[secondary_label Output]
2Hammerhead
3Great White
4Tiger
5Whale

当区块只是一个行时,你经常看到Ruby开发人员用弯曲的字符串取代结束的关键字,并将整个陈述压缩成一个单一的行:

1[label each.rb]
2...
3sharks.each {|shark| puts shark }

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

「each_with_index」方法以类似的方式工作,但它也为您提供了对数组元素的索引的访问。

1[label each_with_index.rb]
2sharks = ["Hammerhead", "Great White", "Tiger", "Whale"]
3sharks.each_with_index do |shark, index|
4  puts "The index is #{index}"
5  puts "The value is #{shark}"
6end

对于数组中的每个元素,Ruby 将元素分配到变量鲨鱼,并将当前索引分配到变量索引

1[secondary_label Output]
2The index is 0
3The value is Hammerhead
4The index is 1
5The value is Great White
6The index is 2
7The value is Tiger
8The index is 3
9The value is Whale

您通常会在自己的程序中重复数组中的元素,例如当您需要在网站上显示数据库中的项目时,或者当您从文件中阅读行并处理其内容时。

结论

数组是Ruby中编程的极其多功能和基本部分,在本教程中,您创建了数组并访问了个别元素,您还在数组中添加,删除和修改了元素,最后,您探索了在数组上重复并显示其内容的两种方法,这是一种常用的显示数据的方法。

了解 Ruby 中的其他数据类型,请阅读教程 理解 Ruby 中的数据类型

Published At
Categories with 技术
Tagged with
comments powered by Disqus