Ruby 數(shù)組(Array)

2022-09-27 10:19 更新

Ruby 數(shù)組是任何對象的有序的、整數(shù)索引的集合。數(shù)組中的每個(gè)元素都與一個(gè)索引相關(guān),并可通過索引進(jìn)行獲取。

數(shù)組的索引從 0 開始,這與 C 或 Java 中一樣。一個(gè)負(fù)數(shù)的索引時(shí)相對于數(shù)組的末尾計(jì)數(shù)的,也就是說,索引為 -1 表示數(shù)組的最后一個(gè)元素,-2 表示數(shù)組中的倒數(shù)第二個(gè)元素,依此類推。

Ruby 數(shù)組可存儲諸如 String、 Integer、 Fixnum、 Hash、 Symbol 等對象,甚至可以是其他 Array 對象。Ruby 數(shù)組不像其他語言中的數(shù)組那么剛性。當(dāng)向數(shù)組添加元素時(shí),Ruby 數(shù)組會自動(dòng)增長。

創(chuàng)建數(shù)組

有多種方式創(chuàng)建或初始化數(shù)組。一種方式是通過 new 類方法:

names = Array.new

您可以在創(chuàng)建數(shù)組的同時(shí)設(shè)置數(shù)組的大?。?/p>

names = Array.new(20)

數(shù)組 names 的大小或長度為 20 個(gè)元素。您可以使用 size 或 length 方法返回?cái)?shù)組的大?。?/p>

#!/usr/bin/ruby

names = Array.new(20)
puts names.size  # 返回 20
puts names.length # 返回 20
嘗試一下 ?


這將產(chǎn)生以下結(jié)果:

20
20

您可以給數(shù)組中的每個(gè)元素賦值,如下所示:

#!/usr/bin/ruby

names = Array.new(4, "mac")

puts "#{names}"

嘗試一下 ?

這將產(chǎn)生以下結(jié)果:

macmacmacmac

您也可以使用帶有 new 的塊,每個(gè)元素使用塊中的計(jì)算結(jié)果來填充:

#!/usr/bin/ruby

nums = Array.new(10) { |e| e = e * 2 }

puts "#{nums}"
嘗試一下 ?

這將產(chǎn)生以下結(jié)果:

[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

數(shù)組還有另一種方法,[],如下所示:

nums = Array.[](1, 2, 3, 4,5)

數(shù)組創(chuàng)建的另一種形式如下所示:

nums = Array[1, 2, 3, 4,5]

在 Ruby 核心模塊中可以有一個(gè)只接收單個(gè)參數(shù)的 Array 方法,該方法使用一個(gè)范圍作為參數(shù)來創(chuàng)建一個(gè)數(shù)字?jǐn)?shù)組:

#!/usr/bin/ruby

digits = Array(0..9)

puts "#{digits}"

以上實(shí)例運(yùn)行輸出結(jié)果為:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

數(shù)組內(nèi)建方法

我們需要有一個(gè) Array 對象的實(shí)例來調(diào)用 Array 方法。下面是創(chuàng)建 Array 對象實(shí)例的方式:

Array.[](...) [or] Array[...] [or] [...]

這將返回一個(gè)使用給定對象進(jìn)行填充的新的數(shù)組?,F(xiàn)在,使用創(chuàng)建的對象,我們可以調(diào)用任意可用的實(shí)例方法。例如:

#!/usr/bin/ruby

digits = Array(0..9)

num = digits.at(6)

puts "#{num}"

這將產(chǎn)生以下結(jié)果:

6

下面是公共的數(shù)組方法(假設(shè) array 是一個(gè) Array 對象):

序號 方法 & 描述
1 array & other_array
返回一個(gè)新的數(shù)組,包含兩個(gè)數(shù)組中共同的元素,沒有重復(fù)。
2 array * int [or] array * str
返回一個(gè)新的數(shù)組,新數(shù)組通過連接 self 的 int 副本創(chuàng)建的。帶有 String 參數(shù)時(shí),相當(dāng)于 self.join(str)。
3 array + other_array
返回一個(gè)新的數(shù)組,新數(shù)組通過連接兩個(gè)數(shù)組產(chǎn)生第三個(gè)數(shù)組創(chuàng)建的。
4 array - other_array
返回一個(gè)新的數(shù)組,新數(shù)組是從初始數(shù)組中移除了在 other_array 中出現(xiàn)的項(xiàng)的副本。
5 str <=> other_str
把 str 與 other_str 進(jìn)行比較,返回 -1(小于)、0(等于)或 1(大于)。比較是區(qū)分大小寫的。
6 array | other_array
通過把 other_array 加入 array 中,移除重復(fù)項(xiàng),返回一個(gè)新的數(shù)組。
7 array << obj
把給定的對象附加到數(shù)組的末尾。該表達(dá)式返回?cái)?shù)組本身,所以幾個(gè)附加可以連在一起。
8 array <=> other_array
如果數(shù)組小于、等于或大于 other_array,則返回一個(gè)整數(shù)(-1、 0 或 +1)。
9 array == other_array
如果兩個(gè)數(shù)組包含相同的元素個(gè)數(shù),且每個(gè)元素與另一個(gè)數(shù)組中相對應(yīng)的元素相等(根據(jù) Object.==),那么這兩個(gè)數(shù)組相等。
10 array[index] [or] array[start, length] [or]
array[range] [or] array.slice(index) [or]
array.slice(start, length) [or] array.slice(range)

返回索引為 index 的元素,或者返回從 start 開始直至 length 個(gè)元素的子數(shù)組,或者返回 range 指定的子數(shù)組。負(fù)值索引從數(shù)組末尾開始計(jì)數(shù)(-1 是最后一個(gè)元素)。如果 index(或開始索引)超出范圍,則返回 nil。
11 array[index] = obj [or]
array[start, length] = obj or an_array or nil [or]
array[range] = obj or an_array or nil

設(shè)置索引為 index 的元素,或者替換從 start 開始直至 length 個(gè)元素的子數(shù)組,或者替換 range 指定的子數(shù)組。如果索引大于數(shù)組的當(dāng)前容量,那么數(shù)組會自動(dòng)增長。負(fù)值索引從數(shù)組末尾開始計(jì)數(shù)。如果 length 為零則插入元素。如果在第二種或第三種形式中使用了 nil,則從 self 刪除元素。
12 array.abbrev(pattern = nil)
self 中的字符串計(jì)算明確的縮寫集合。如果傳遞一個(gè)模式或一個(gè)字符串,只考慮當(dāng)字符串匹配模式或者以該字符串開始時(shí)的情況。
13 array.assoc(obj)
搜索一個(gè)數(shù)組,其元素也是數(shù)組,使用 obj.== 把 obj 與每個(gè)包含的數(shù)組的第一個(gè)元素進(jìn)行比較。如果匹配則返回第一個(gè)包含的數(shù)組,如果未找到匹配則返回 nil。
14 array.at(index)
返回索引為 index 的元素。一個(gè)負(fù)值索引從 self 的末尾開始計(jì)數(shù)。如果索引超出范圍則返回 nil。
15 array.clear
從數(shù)組中移除所有的元素。
16 array.collect { |item| block } [or]
array.map { |item| block }

self 中的每個(gè)元素調(diào)用一次 block。創(chuàng)建一個(gè)新的數(shù)組,包含 block 返回的值。
17 array.collect! { |item| block } [or]
array.map! { |item| block }

self 中的每個(gè)元素調(diào)用一次 block,把元素替換為 block 返回的值。
18 array.compact
返回 self 的副本,移除了所有的 nil 元素。
19 array.compact!
從數(shù)組中移除所有的 nil 元素。如果沒有變化則返回 nil。
20 array.concat(other_array)
追加 other_array 中的元素到 self 中。
21 array.delete(obj) [or]
array.delete(obj) { block }

self 中刪除等于 obj 的項(xiàng)。如果未找到相等項(xiàng),則返回 nil。如果未找到相等項(xiàng)且給出了可選的代碼 block,則返回 block 的結(jié)果。
22 array.delete_at(index)
刪除指定的 index 處的元素,并返回該元素。如果 index 超出范圍,則返回 nil。
23 array.delete_if { |item| block }
當(dāng) block 為 true 時(shí),刪除 self 的每個(gè)元素。
24 array.each { |item| block }
self 中的每個(gè)元素調(diào)用一次 block,傳遞該元素作為參數(shù)。
25 array.each_index { |index| block }
與 Array#each 相同,但是傳遞元素的 index,而不是傳遞元素本身。
26 array.empty?
如果數(shù)組本身沒有包含元素,則返回 true。
27 array.eql?(other)
如果 arrayother 是相同的對象,或者兩個(gè)數(shù)組帶有相同的內(nèi)容,則返回 true。
28 array.fetch(index) [or]
array.fetch(index, default) [or]
array.fetch(index) { |index| block }

嘗試返回位置 index 處的元素。如果 index 位于數(shù)組外部,則第一種形式會拋出 IndexError 異常,第二種形式會返回 default,第三種形式會返回調(diào)用 block 傳入 index 的值。負(fù)值的 index 從數(shù)組末尾開始計(jì)數(shù)。
29 array.fill(obj) [or]
array.fill(obj, start [, length]) [or]
array.fill(obj, range) [or]
array.fill { |index| block } [or]
array.fill(start [, length] ) { |index| block } [or]
array.fill(range) { |index| block }

前面三種形式設(shè)置 self 的被選元素為 obj。以 nil 開頭相當(dāng)于零。nil 的長度相當(dāng)于 self.length。最后三種形式用 block 的值填充數(shù)組。block 通過帶有被填充的每個(gè)元素的絕對索引來傳遞。
30 array.first [or]
array.first(n)

返回?cái)?shù)組的第一個(gè)元素或前 n 個(gè)元素。如果數(shù)組為空,則第一種形式返回 nil,第二種形式返回一個(gè)空的數(shù)組。
31 array.flatten
返回一個(gè)新的數(shù)組,新數(shù)組是一個(gè)一維的扁平化的數(shù)組(遞歸)。
32 array.flatten!
array 進(jìn)行扁平化。如果沒有變化則返回 nil。(數(shù)組不包含子數(shù)組。)
33 array.frozen?
如果 array 被凍結(jié)(或排序時(shí)暫時(shí)凍結(jié)),則返回 true。
34 array.hash
計(jì)算數(shù)組的哈希代碼。兩個(gè)具有相同內(nèi)容的數(shù)組將具有相同的哈希代碼。
35 array.include?(obj)
如果 self 中包含 obj,則返回 true,否則返回 false。
36 array.index(obj)
返回 self 中第一個(gè)等于 obj 的對象的 index。如果未找到匹配則返回 nil
37 array.indexes(i1, i2, ... iN) [or]
array.indices(i1, i2, ... iN)

該方法在 Ruby 的最新版本中被廢棄,所以請使用 Array#values_at。
38 array.indices(i1, i2, ... iN) [or]
array.indexes(i1, i2, ... iN)

該方法在 Ruby 的最新版本中被廢棄,所以請使用 Array#values_at。
39 array.insert(index, obj...)
在給定的 index 的元素前插入給定的值,index 可以是負(fù)值。
40 array.inspect
創(chuàng)建一個(gè)數(shù)組的可打印版本。
41 array.join(sep=$,)
返回一個(gè)字符串,通過把數(shù)組的每個(gè)元素轉(zhuǎn)換為字符串,并使用 sep 分隔進(jìn)行創(chuàng)建的。
42 array.last [or] array.last(n)
返回 self 的最后一個(gè)元素。如果數(shù)組為,則第一種形式返回 nil。
43 array.length
返回 self 中元素的個(gè)數(shù)??赡転榱?。
44 array.map { |item| block } [or]
array.collect { |item| block }

self 的每個(gè)元素調(diào)用一次 block。創(chuàng)建一個(gè)新的數(shù)組,包含 block 返回的值。
45 array.map! { |item| block } [or]
array.collect! { |item| block }

array 的每個(gè)元素調(diào)用一次 block,把元素替換為 block 返回的值。
46 array.nitems
返回 self 中 non-nil 元素的個(gè)數(shù)??赡転榱?。
47 array.pack(aTemplateString)
根據(jù) aTemplateString 中的指令,把數(shù)組的內(nèi)容壓縮為二進(jìn)制序列。指令 A、 a 和 Z 后可以跟一個(gè)表示結(jié)果字段寬度的數(shù)字。剩余的指令也可以帶有一個(gè)表示要轉(zhuǎn)換的數(shù)組元素個(gè)數(shù)的數(shù)字。如果數(shù)字是一個(gè)星號(*),則所有剩余的數(shù)組元素都將被轉(zhuǎn)換。任何指令后都可以跟一個(gè)下劃線(_),表示指定類型使用底層平臺的本地尺寸大小,否則使用獨(dú)立于平臺的一致的尺寸大小。在模板字符串中空格會被忽略。
48 array.pop
array 中移除最后一個(gè)元素,并返回該元素。如果 array 為空則返回 nil。
49 array.push(obj, ...)
把給定的 obj 附加到數(shù)組的末尾。該表達(dá)式返回?cái)?shù)組本身,所以幾個(gè)附加可以連在一起。
50 array.rassoc(key)
搜索一個(gè)數(shù)組,其元素也是數(shù)組,使用 == 把 key 與每個(gè)包含的數(shù)組的第二個(gè)元素進(jìn)行比較。如果匹配則返回第一個(gè)包含的數(shù)組。
51 array.reject { |item| block }
返回一個(gè)新的數(shù)組,包含當(dāng) block 不為 true 時(shí)的數(shù)組項(xiàng)。
52 array.reject! { |item| block }
當(dāng) block 為真時(shí),從 array 刪除元素,如果沒有變化則返回 nil。相當(dāng)于 Array#delete_if。
53 array.replace(other_array)
array 的內(nèi)容替換為 other_array 的內(nèi)容,必要的時(shí)候進(jìn)行截?cái)嗷驍U(kuò)充。
54 array.reverse
返回一個(gè)新的數(shù)組,包含倒序排列的數(shù)組元素。
55 array.reverse!
array 進(jìn)行逆轉(zhuǎn)。
56 array.reverse_each {|item| block }
與 Array#each 相同,但是把 array 進(jìn)行逆轉(zhuǎn)。
57 array.rindex(obj)
返回 array 中最后一個(gè)等于 obj 的對象的索引。如果未找到匹配,則返回 nil。
58 array.select {|item| block }
調(diào)用從數(shù)組傳入連續(xù)元素的 block,返回一個(gè)數(shù)組,包含 block 返回 true 值時(shí)的元素。
59 array.shift
返回 self 的第一個(gè)元素,并移除該元素(把所有的其他元素下移一位)。如果數(shù)組為空,則返回 nil。
60 array.size
返回 array 的長度(元素的個(gè)數(shù))。length 的別名。
61 array.slice(index) [or] array.slice(start, length) [or]
array.slice(range) [or] array[index] [or]
array[start, length] [or] array[range]

返回索引為 index 的元素,或者返回從 start 開始直至 length 個(gè)元素的子數(shù)組,或者返回 range 指定的子數(shù)組。負(fù)值索引從數(shù)組末尾開始計(jì)數(shù)(-1 是最后一個(gè)元素)。如果 index(或開始索引)超出范圍,則返回 nil。
62 array.slice!(index) [or] array.slice!(start, length) [or]
array.slice!(range)

刪除 index(長度是可選的)或 range 指定的元素。返回被刪除的對象、子數(shù)組,如果 index 超出范圍,則返回 nil。
63 array.sort [or] array.sort { | a,b | block }
返回一個(gè)排序的數(shù)組。
64 array.sort! [or] array.sort! { | a,b | block }
把數(shù)組進(jìn)行排序。
65 array.to_a
返回 self。如果在 Array 的子類上調(diào)用,則把接收參數(shù)轉(zhuǎn)換為一個(gè) Array 對象。
66 array.to_ary
返回 self。
67 array.to_s
返回 self.join。
68 array.transpose
假設(shè) self 是數(shù)組的數(shù)組,且置換行和列。
69 array.uniq
返回一個(gè)新的數(shù)組,移除了 array 中的重復(fù)值。
70 array.uniq!
self 中移除重復(fù)元素。如果沒有變化(也就是說,未找到重復(fù)),則返回 nil。
71 array.unshift(obj, ...)
把對象前置在數(shù)組的前面,其他元素上移一位。
72 array.values_at(selector,...)
返回一個(gè)數(shù)組,包含 self 中與給定的 selector(一個(gè)或多個(gè))相對應(yīng)的元素。選擇器可以是整數(shù)索引或者范圍。
73 array.zip(arg, ...) [or]
array.zip(arg, ...){ | arr | block }

把任何參數(shù)轉(zhuǎn)換為數(shù)組,然后把 array 的元素與每個(gè)參數(shù)中相對應(yīng)的元素合并。

數(shù)組 pack 指令

下表列出了方法 Array#pack 的壓縮指令。

指令 描述
@ 移動(dòng)到絕對位置。
A ASCII 字符串(填充 space,count 是寬度)。
a ASCII 字符串(填充 null,count 是寬度)。
B 位字符串(降序)
b 位字符串(升序)。
C 無符號字符。
c 字符。
D, d 雙精度浮點(diǎn)數(shù),原生格式。
E 雙精度浮點(diǎn)數(shù),little-endian 字節(jié)順序。
e 單精度浮點(diǎn)數(shù),little-endian 字節(jié)順序。
F, f 單精度浮點(diǎn)數(shù),原生格式。
G 雙精度浮點(diǎn)數(shù),network(big-endian)字節(jié)順序。
g 單精度浮點(diǎn)數(shù),network(big-endian)字節(jié)順序。
H 十六進(jìn)制字符串(高位優(yōu)先)。
h 十六進(jìn)制字符串(低位優(yōu)先)。
I 無符號整數(shù)。
i 整數(shù)。
L 無符號 long。
l Long。
M 引用可打印的,MIME 編碼。
m Base64 編碼字符串。
N Long,network(big-endian)字節(jié)順序。
n Short,network(big-endian)字節(jié)順序。
P 指向一個(gè)結(jié)構(gòu)(固定長度的字符串)。
p 指向一個(gè)空結(jié)束字符串。
Q, q 64 位數(shù)字。
S 無符號 short。
s Short。
U UTF-8。
u UU 編碼字符串。
V Long,little-endian 字節(jié)順序。
v Short,little-endian 字節(jié)順序。
w BER 壓縮的整數(shù) \fnm。
X 向后跳過一個(gè)字節(jié)。
x Null 字節(jié)。
Z 與 a 相同,除了 null 會被加上 *。

實(shí)例

嘗試下面的實(shí)例,壓縮各種數(shù)據(jù)。

a = [ "a", "b", "c" ]
n = [ 65, 66, 67 ]
puts a.pack("A3A3A3")   #=> "a  b  c  "
puts a.pack("a3a3a3")   #=> "a0000b0000c0000"
puts n.pack("ccc")      #=> "ABC"

這將產(chǎn)生以下結(jié)果:

a  b  c
abc
ABC
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號