Ruby - 数组
Ruby 数组是有序的,整数索引的任何对象的集合。数组中的每个元素都与一个索引相关联,并由该索引引用。
数组索引从 0 开始,就像在 C 或 Java 中一样。负索引被认为相对于数组的末尾——也就是说,索引 -1 指示数组的最后一个元素,-2 是数组的倒数第二个元素,依此类推。
Ruby 数组可以保存诸如字符串、整数、Fixnum、哈希表、符号,甚至其他数组对象等对象。Ruby 数组不像其他语言中的数组那样严格。在向 Ruby 数组添加元素时,它们会自动增长。
创建数组
有许多方法可以创建或初始化数组。一种方法是使用 new 类方法 -
names = Array.new
您可以在创建数组时设置数组的大小 -
names = Array.new(20)
数组 names 现在有 20 个元素的大小或长度。您可以使用 size 或 length 方法返回数组的大小 -
#!/usr/bin/ruby
names = Array.new(20)
puts names.size # This returns 20
puts names.length # This also returns 20
这将产生以下结果 -
20
20
您可以如下为数组中的每个元素分配一个值 -
#!/usr/bin/ruby
names = Array.new(4, "mac")
puts "#{names}"
这将产生以下结果 -
["mac", "mac", "mac", "mac"]
您还可以将代码块与 new 一起使用,使用代码块计算的结果填充每个元素 -
#!/usr/bin/ruby
nums = Array.new(10) { |e| e = e * 2 }
puts "#{nums}"
这将产生以下结果 -
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
Array 还有另一种方法,[]。它的工作原理如下 -
nums = Array.[](1, 2, 3, 4,5)
数组创建的另一种形式如下 -
nums = Array[1, 2, 3, 4,5]
核心 Ruby 中提供的 Kernel 模块有一个 Array 方法,它只接受一个参数。这里,该方法采用一个范围作为参数来创建一个数字数组 -
#!/usr/bin/ruby
digits = Array(0..9)
puts "#{digits}"
这将产生以下结果 -
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
数组内置方法
我们需要有一个 Array 对象的实例才能调用 Array 方法。正如我们所看到的,以下是如何创建 Array 对象的实例 -
Array.[](...) [or] Array[...] [or] [...]
这将返回一个用给定对象填充的新数组。现在,使用创建的对象,我们可以调用任何可用的实例方法。例如 -
#!/usr/bin/ruby
digits = Array(0..9)
num = digits.at(6)
puts "#{num}"
这将产生以下结果 -
6
| 序号 |
方法和描述 |
| 1 |
array & other_array
返回一个新数组,其中包含两个数组共有的元素,没有重复。 |
| 2 |
array * int [或] array * str
返回一个新数组,该数组通过连接 self 的 int 个副本构建而成。对于字符串参数,等效于 self.join(str)。 |
| 3 |
array + other_array
返回一个新数组,该数组通过将两个数组连接在一起以生成第三个数组来构建。 |
| 4 |
array - other_array
返回一个新数组,它是原始数组的副本,删除了也出现在 other_array 中的任何项目。 |
| 5 |
array <=> other_array
将 str 与 other_str 进行比较,返回 -1(小于)、0(等于)或 1(大于)。比较区分大小写。 |
| 6 |
array | other_array
通过连接 array 和 other_array 返回一个新数组,删除重复项。 |
| 7 |
array << obj
将给定对象推送到 array 的末尾。此表达式返回数组本身,因此可以将多个追加链接在一起。 |
| 8 |
array <=> other_array
如果此数组小于、等于或大于 other_array,则返回一个整数(-1、0 或 +1)。 |
| 9 |
array == other_array
如果两个数组包含相同数量的元素,并且每个元素都等于(根据 Object.==)另一个数组中的对应元素,则这两个数组相等。 |
| 10 |
array[index] [或] array[start, length] [或]
array[range] [或] array.slice(index) [或]
array.slice(start, length) [或] array.slice(range)
返回 index 处的元素,或返回从 start 开始并继续 length 个元素的子数组,或返回由 range 指定的子数组。负索引从数组的末尾反向计数(-1 是最后一个元素)。如果索引(或起始索引)超出范围,则返回 nil。 |
| 11 |
array[index] = obj [或]
array[start, length] = obj 或 an_array 或 nil [或]
array[range] = obj 或 an_array 或 nil
设置 index 处的元素,或替换从 start 开始并继续 length 个元素的子数组,或替换由 range 指定的子数组。如果索引大于数组的当前容量,则数组会自动增长。负索引将从数组的末尾反向计数。如果 length 为零,则插入元素。如果在第二种和第三种形式中使用 nil,则从 self 中删除元素。 |
| 12 |
array.abbrev(pattern = nil)
计算 self 中字符串的一组明确的缩写。如果传递了一个模式或一个字符串,则只考虑与模式匹配或以字符串开头的字符串。 |
| 13 |
array.assoc(obj)
搜索一个元素也是数组的数组,使用 obj.== 将 obj 与每个包含数组的第一个元素进行比较。返回第一个匹配的包含数组,如果未找到匹配项则返回 nil。 |
| 14 |
array.at(index)
返回 index 处的元素。负索引从 self 的末尾开始计数。如果索引超出范围,则返回 nil。 |
| 15 |
array.clear
从 array 中删除所有元素。 |
| 16 |
array.collect { |item| block } [或]
array.map { |item| block }
为 self 的每个元素调用一次 block。创建一个新数组,其中包含 block 返回的值。 |
| 17 |
array.collect! { |item| block } [或]
array.map! { |item| block }
为 self 的每个元素调用一次 block,用 block 返回的值替换该元素。 |
| 18 |
array.compact
返回 self 的副本,其中所有 nil 元素都已删除。 |
| 19 |
array.compact!
从 array 中删除 nil 元素。如果未进行任何更改,则返回 nil。 |
| 20 |
array.concat(other_array)
将 other_array 中的元素附加到 self。 |
| 21 |
array.delete(obj) [或]
array.delete(obj) { block }
删除 self 中等于 obj 的项目。如果未找到该项目,则返回 nil。如果给出了可选的代码 block,则如果未找到该项目,则返回 block 的结果。 |
| 22 |
array.delete_at(index)
删除指定 index 处的元素,返回该元素,如果索引超出范围则返回 nil。 |
| 23 |
array.delete_if { |item| block }
删除 self 的每个元素,对于这些元素,block 的计算结果为 true。 |
| 24 |
array.each { |item| block }
为 self 中的每个元素调用一次 block,并将该元素作为参数传递。 |
| 25 |
array.each_index { |index| block }
与 Array#each 相同,但传递元素的 index 而不是元素本身。 |
| 26 |
array.empty?
如果 self 数组不包含任何元素,则返回 true。 |
| 27 |
array.eql?(other)
如果 array 和 other 是同一个对象,或者都是具有相同内容的数组,则返回 true。 |
| 28 |
array.fetch(index) [或]
array.fetch(index, default) [或]
array.fetch(index) { |index| block }
尝试返回 position index 处的元素。如果 index 超出数组范围,则第一种形式抛出 IndexError 异常,第二种形式返回 default,第三种形式返回调用 block 的值,并将 index 传入其中。index 的负值从数组的末尾开始计数。 |
| 29 |
array.fill(obj) [或]
array.fill(obj, start [, length]) [或]
array.fill(obj, range) [或]
array.fill { |index| block } [或]
array.fill(start [, length] ) { |index| block } [或]
array.fill(range) { |index| block }
前三种形式将 self 的选定元素设置为 obj。nil 的起始位置等效于零。nil 的长度等效于 self.length。后三种形式使用 block 的值 fill 数组。block 会传递要填充的每个元素的绝对索引。 |
| 30 |
array.first [或]
array.first(n)
返回数组的第一个元素或前 n 个元素。如果数组为空,则第一种形式返回 nil,第二种形式返回一个空数组。 |
| 31 |
array.flatten
返回一个新数组,它是此数组的一维展平(递归)。 |
| 32 |
array.flatten!
就地展平 array。如果未进行任何修改,则返回 nil。(数组不包含任何子数组。) |
| 33 |
array.frozen?
如果 array 被冻结(或在排序时暂时被冻结),则返回 true。 |
| 34 |
array.hash
计算 array 的哈希码。两个内容相同的数组将具有相同的哈希码。 |
| 35 |
array.include?(obj)
如果 obj 出现在 self 中,则返回 true,否则返回 false。 |
| 36 |
array.index(obj)
返回 self 中第一个与 obj 相等的(==)对象的 index。如果未找到匹配项,则返回 nil。 |
| 37 |
array.indexes(i1, i2, ... iN) [或]
array.indices(i1, i2, ... iN)
此方法在最新版本的 Ruby 中已弃用,因此请使用 Array#values_at。 |
| 38 |
array.indices(i1, i2, ... iN) [或]
array.indexes(i1, i2, ... iN)
此方法在最新版本的 Ruby 中已弃用,因此请使用 Array#values_at。 |
| 39 |
array.insert(index, obj...)
在具有给定 index(可以为负数)的元素之前插入给定的值。 |
| 40 |
array.inspect
创建 array 的可打印版本。 |
| 41 |
array.join(sep = $,)
返回一个字符串,该字符串通过将数组的每个元素转换为字符串并用 sep 分隔来创建。 |
| 42 |
array.last [或] array.last(n)
返回 self 的最后一个元素。如果数组 empty,则第一种形式返回 nil。 |
| 43 |
array.length
返回 self 中的元素数量。可以为零。 |
| 44 |
array.map { |item| block } [或]
array.collect { |item| block }
为 self 的每个元素调用一次 block。创建一个包含 block 返回的值的 新 数组。 |
| 45 |
array.map! { |item| block } [或]
array.collect! { |item| block }
为 array 的每个元素调用一次 block,用 block 返回的值替换该元素。 |
| 46 |
array.nitems
返回 self 中非 nil 元素的数量。可以为零。 |
| 47 |
array.pack(aTemplateString)
根据 TemplateString 中的指令将数组的内容打包成二进制序列。指令 A、a 和 Z 后面可以跟着一个计数,表示结果字段的宽度。其余指令也可以带一个计数,表示要转换的数组元素的数量。如果计数是星号 (*),则会转换所有剩余的数组元素。任何指令后面仍然可以跟着下划线 (_) 以使用指定类型的底层平台的本机大小;否则,它们使用平台无关的大小。模板字符串中的空格将被忽略。 |
| 48 |
array.pop
移除array的最后一个元素并返回它,如果array为空则返回nil。 |
| 49 |
array.push(obj, ...)
将给定的 obj 推送到(追加到)此数组的末尾。此表达式返回数组本身,因此可以将多个追加操作链接在一起。 |
| 50 |
array.rassoc(key)
搜索元素也是数组的数组。使用 == 将key与每个包含数组的第二个元素进行比较。返回第一个匹配的包含数组。 |
| 51 |
array.reject { |item| block }
返回一个新数组,其中包含array中块不为true的项。 |
| 52 |
array.reject! { |item| block }
删除array中块计算结果为true的元素,但如果未进行任何更改则返回nil。等同于 Array#delete_if。 |
| 53 |
array.replace(other_array)
用other_array的内容替换array的内容,必要时进行截断或扩展。 |
| 54 |
array.reverse
返回一个新数组,其中包含array的元素,顺序相反。 |
| 55 |
array.reverse!
就地反转array。 |
| 56 |
array.reverse_each {|item| block }
与 Array#each 相同,但以相反的顺序遍历array。 |
| 57 |
array.rindex(obj)
返回array中最后一个与 obj 相等的对象的索引。如果未找到匹配项,则返回nil。 |
| 58 |
array.select {|item| block }
调用块,将array中的连续元素传递给它,并返回一个数组,其中包含块返回true值的那些元素。 |
| 59 |
array.shift
返回self的第一个元素并将其移除(将所有其他元素向下移动一个位置)。如果数组为空,则返回nil。 |
| 60 |
array.size
返回array的长度(元素数量)。length 的别名。 |
| 61 |
array.slice(index) [或] array.slice(start, length) [或]
array.slice(range) [或] array[index] [或]
array[start, length] [或] array[range]
返回index处的元素,或返回从start开始并继续length个元素的子数组,或返回由range指定的子数组。负索引从数组末尾反向计数(-1 是最后一个元素)。如果index(或起始索引)超出范围,则返回nil。 |
| 62 |
array.slice!(index) [或] array.slice!(start, length) [或]
array.slice!(range)
删除由index(可选地带长度)或range给出的元素。返回删除的对象、子数组或nil(如果index超出范围)。 |
| 63 |
array.sort [或] array.sort { | a,b | block }
返回通过对 self 进行排序创建的新数组。 |
| 64 |
array.sort! [或] array.sort! { | a,b | block }
对 self 进行排序。 |
| 65 |
array.to_a
返回self。如果在Array的子类上调用,则将接收方转换为 Array 对象。 |
| 66 |
array.to_ary
返回 self。 |
| 67 |
array.to_s
返回 self.join。 |
| 68 |
array.transpose
假设 self 是一个数组的数组,并转置行和列。 |
| 69 |
array.uniq
通过移除array中的重复值返回一个新数组。 |
| 70 |
array.uniq!
从self中移除重复元素。如果未进行任何更改(即未找到重复项),则返回nil。 |
| 71 |
array.unshift(obj, ...)
将对象添加到数组的前面,其他元素向上移动一个位置。 |
| 72 |
array.values_at(selector,...)
返回一个数组,其中包含 self 中与给定selector(一个或多个)相对应的元素。选择器可以是整数索引或范围。 |
| 73 |
array.zip(arg, ...) [或]
array.zip(arg, ...){ | arr | block }
将任何参数转换为数组,然后将array的元素与每个参数中的对应元素合并。 |
Array 打包指令
| 序号 |
指令 & 描述 |
| 1 |
@
移动到绝对位置。 |
| 2 |
A
ASCII 字符串(空格填充,计数为宽度)。 |
| 3 |
a
ASCII 字符串(空字符填充,计数为宽度)。 |
| 4 |
B
字符串(降序位顺序)。 |
| 5 |
b
位字符串(升序位顺序)。 |
| 6 |
C
无符号字符。 |
| 7 |
c
字符。 |
| 8 |
D, d
双精度浮点数,本机格式。 |
| 9 |
E
双精度浮点数,小端字节序。 |
| 10 |
e
单精度浮点数,小端字节序。 |
| 11 |
F, f
单精度浮点数,本机格式。 |
| 12 |
G
双精度浮点数,网络(大端)字节序。 |
| 13 |
g
单精度浮点数,网络(大端)字节序。 |
| 14 |
H
十六进制字符串(高位字节优先)。 |
| 15 |
h
十六进制字符串(低位字节优先)。 |
| 16 |
I
无符号整数。 |
| 17 |
i
整数。 |
| 18 |
L
无符号长整数。 |
| 19 |
l
长整数。 |
| 20 |
M
带引号的可打印字符串,MIME 编码(参见 RFC 2045)。 |
| 21 |
m
Base64 编码的字符串。 |
| 22 |
N
长整数,网络(大端)字节序。 |
| 23 |
n
短整数,网络(大端)字节序。 |
| 24 |
P
指向结构的指针(定长字符串)。 |
| 25 |
p
指向空字符终止字符串的指针。 |
| 26 |
Q, q
64 位数字。 |
| 27 |
S
无符号短整数。 |
| 28 |
s
短整数。 |
| 29 |
U
UTF-8。 |
| 30 |
u
UU 编码的字符串。 |
| 31 |
V
长整数,小端字节序。 |
| 32 |
v
短整数,小端字节序。 |
| 33 |
w
BER 压缩整数 \fnm。 |
| 34 |
X
后退一个字节。 |
| 35 |
x
空字节。 |
| 36 |
Z
与 a 相同,但使用 * 添加空字符。 |
示例
尝试以下示例以打包各种数据。
a = [ "a", "b", "c" ]
n = [ 65, 66, 67 ]
puts a.pack("A3A3A3") #=> "a b c "
puts a.pack("a3a3a3") #=> "a\000\000b\000\000c\000\000"
puts n.pack("ccc") #=> "ABC"
这将产生以下结果 -
a b c
abc
ABC