介绍
一个 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"]
鲨鱼
数组有三个元素. 以下是鲨鱼
数组中的每个元素的索引。
Hammerhead | Great White | Tiger |
---|---|---|
0 | 1 | 2 |
数组中的第一个元素是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
你在你的鲨鱼
系列中有三个元素,这些元素从0
到2
进行索引:
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"]
这一次,天使
被从数组的开始删除。
通过使用pop
和shift
,您可以从序列的开始和结束中删除元素,最好在可能的情况下使用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 中的数据类型。