Ruby 數(shù)組(Array)

2022-09-27 10:19 更新

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

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

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

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

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

names = Array.new

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

names = Array.new(20)

數(shù)組 names 的大小或長度為 20 個元素。您可以使用 size 或 length 方法返回數(shù)組的大小:

#!/usr/bin/ruby

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


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

20
20

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

#!/usr/bin/ruby

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

puts "#{names}"

嘗試一下 ?

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

macmacmacmac

您也可以使用帶有 new 的塊,每個元素使用塊中的計算結(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 核心模塊中可以有一個只接收單個參數(shù)的 Array 方法,該方法使用一個范圍作為參數(shù)來創(chuàng)建一個數(shù)字?jǐn)?shù)組:

#!/usr/bin/ruby

digits = Array(0..9)

puts "#{digits}"

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

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

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

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

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

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

#!/usr/bin/ruby

digits = Array(0..9)

num = digits.at(6)

puts "#{num}"

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

6

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

序號 方法 & 描述
1 array & other_array
返回一個新的數(shù)組,包含兩個數(shù)組中共同的元素,沒有重復(fù)。
2 array * int [or] array * str
返回一個新的數(shù)組,新數(shù)組通過連接 self 的 int 副本創(chuàng)建的。帶有 String 參數(shù)時,相當(dāng)于 self.join(str)。
3 array + other_array
返回一個新的數(shù)組,新數(shù)組通過連接兩個數(shù)組產(chǎn)生第三個數(shù)組創(chuàng)建的。
4 array - other_array
返回一個新的數(shù)組,新數(shù)組是從初始數(shù)組中移除了在 other_array 中出現(xiàn)的項的副本。
5 str <=> other_str
把 str 與 other_str 進(jìn)行比較,返回 -1(小于)、0(等于)或 1(大于)。比較是區(qū)分大小寫的。
6 array | other_array
通過把 other_array 加入 array 中,移除重復(fù)項,返回一個新的數(shù)組。
7 array << obj
把給定的對象附加到數(shù)組的末尾。該表達(dá)式返回數(shù)組本身,所以幾個附加可以連在一起。
8 array <=> other_array
如果數(shù)組小于、等于或大于 other_array,則返回一個整數(shù)(-1、 0 或 +1)。
9 array == other_array
如果兩個數(shù)組包含相同的元素個數(shù),且每個元素與另一個數(shù)組中相對應(yīng)的元素相等(根據(jù) Object.==),那么這兩個數(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 個元素的子數(shù)組,或者返回 range 指定的子數(shù)組。負(fù)值索引從數(shù)組末尾開始計數(shù)(-1 是最后一個元素)。如果 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 個元素的子數(shù)組,或者替換 range 指定的子數(shù)組。如果索引大于數(shù)組的當(dāng)前容量,那么數(shù)組會自動增長。負(fù)值索引從數(shù)組末尾開始計數(shù)。如果 length 為零則插入元素。如果在第二種或第三種形式中使用了 nil,則從 self 刪除元素。
12 array.abbrev(pattern = nil)
self 中的字符串計算明確的縮寫集合。如果傳遞一個模式或一個字符串,只考慮當(dāng)字符串匹配模式或者以該字符串開始時的情況。
13 array.assoc(obj)
搜索一個數(shù)組,其元素也是數(shù)組,使用 obj.== 把 obj 與每個包含的數(shù)組的第一個元素進(jìn)行比較。如果匹配則返回第一個包含的數(shù)組,如果未找到匹配則返回 nil
14 array.at(index)
返回索引為 index 的元素。一個負(fù)值索引從 self 的末尾開始計數(shù)。如果索引超出范圍則返回 nil。
15 array.clear
從數(shù)組中移除所有的元素。
16 array.collect { |item| block } [or]
array.map { |item| block }

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

self 中的每個元素調(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 的項。如果未找到相等項,則返回 nil。如果未找到相等項且給出了可選的代碼 block,則返回 block 的結(jié)果。
22 array.delete_at(index)
刪除指定的 index 處的元素,并返回該元素。如果 index 超出范圍,則返回 nil
23 array.delete_if { |item| block }
當(dāng) block 為 true 時,刪除 self 的每個元素。
24 array.each { |item| block }
self 中的每個元素調(diào)用一次 block,傳遞該元素作為參數(shù)。
25 array.each_index { |index| block }
與 Array#each 相同,但是傳遞元素的 index,而不是傳遞元素本身。
26 array.empty?
如果數(shù)組本身沒有包含元素,則返回 true。
27 array.eql?(other)
如果 arrayother 是相同的對象,或者兩個數(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ù)組末尾開始計數(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 通過帶有被填充的每個元素的絕對索引來傳遞。
30 array.first [or]
array.first(n)

返回數(shù)組的第一個元素或前 n 個元素。如果數(shù)組為空,則第一種形式返回 nil,第二種形式返回一個空的數(shù)組。
31 array.flatten
返回一個新的數(shù)組,新數(shù)組是一個一維的扁平化的數(shù)組(遞歸)。
32 array.flatten!
array 進(jìn)行扁平化。如果沒有變化則返回 nil。(數(shù)組不包含子數(shù)組。)
33 array.frozen?
如果 array 被凍結(jié)(或排序時暫時凍結(jié)),則返回 true。
34 array.hash
計算數(shù)組的哈希代碼。兩個具有相同內(nèi)容的數(shù)組將具有相同的哈希代碼。
35 array.include?(obj)
如果 self 中包含 obj,則返回 true,否則返回 false。
36 array.index(obj)
返回 self 中第一個等于 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)建一個數(shù)組的可打印版本。
41 array.join(sep=$,)
返回一個字符串,通過把數(shù)組的每個元素轉(zhuǎn)換為字符串,并使用 sep 分隔進(jìn)行創(chuàng)建的。
42 array.last [or] array.last(n)
返回 self 的最后一個元素。如果數(shù)組為,則第一種形式返回 nil。
43 array.length
返回 self 中元素的個數(shù)??赡転榱恪?/td>
44 array.map { |item| block } [or]
array.collect { |item| block }

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

array 的每個元素調(diào)用一次 block,把元素替換為 block 返回的值。
46 array.nitems
返回 self 中 non-nil 元素的個數(shù)??赡転榱?。
47 array.pack(aTemplateString)
根據(jù) aTemplateString 中的指令,把數(shù)組的內(nèi)容壓縮為二進(jìn)制序列。指令 A、 a 和 Z 后可以跟一個表示結(jié)果字段寬度的數(shù)字。剩余的指令也可以帶有一個表示要轉(zhuǎn)換的數(shù)組元素個數(shù)的數(shù)字。如果數(shù)字是一個星號(*),則所有剩余的數(shù)組元素都將被轉(zhuǎn)換。任何指令后都可以跟一個下劃線(_),表示指定類型使用底層平臺的本地尺寸大小,否則使用獨(dú)立于平臺的一致的尺寸大小。在模板字符串中空格會被忽略。
48 array.pop
array 中移除最后一個元素,并返回該元素。如果 array 為空則返回 nil。
49 array.push(obj, ...)
把給定的 obj 附加到數(shù)組的末尾。該表達(dá)式返回數(shù)組本身,所以幾個附加可以連在一起。
50 array.rassoc(key)
搜索一個數(shù)組,其元素也是數(shù)組,使用 == 把 key 與每個包含的數(shù)組的第二個元素進(jìn)行比較。如果匹配則返回第一個包含的數(shù)組。
51 array.reject { |item| block }
返回一個新的數(shù)組,包含當(dāng) block 不為 true 時的數(shù)組項。
52 array.reject! { |item| block }
當(dāng) block 為真時,從 array 刪除元素,如果沒有變化則返回 nil。相當(dāng)于 Array#delete_if。
53 array.replace(other_array)
array 的內(nèi)容替換為 other_array 的內(nèi)容,必要的時候進(jìn)行截斷或擴(kuò)充。
54 array.reverse
返回一個新的數(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 中最后一個等于 obj 的對象的索引。如果未找到匹配,則返回 nil。
58 array.select {|item| block }
調(diào)用從數(shù)組傳入連續(xù)元素的 block,返回一個數(shù)組,包含 block 返回 true 值時的元素。
59 array.shift
返回 self 的第一個元素,并移除該元素(把所有的其他元素下移一位)。如果數(shù)組為空,則返回 nil。
60 array.size
返回 array 的長度(元素的個數(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 個元素的子數(shù)組,或者返回 range 指定的子數(shù)組。負(fù)值索引從數(shù)組末尾開始計數(shù)(-1 是最后一個元素)。如果 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 }
返回一個排序的數(shù)組。
64 array.sort! [or] array.sort! { | a,b | block }
把數(shù)組進(jìn)行排序。
65 array.to_a
返回 self。如果在 Array 的子類上調(diào)用,則把接收參數(shù)轉(zhuǎn)換為一個 Array 對象。
66 array.to_ary
返回 self。
67 array.to_s
返回 self.join。
68 array.transpose
假設(shè) self 是數(shù)組的數(shù)組,且置換行和列。
69 array.uniq
返回一個新的數(shù)組,移除了 array 中的重復(fù)值。
70 array.uniq!
self 中移除重復(fù)元素。如果沒有變化(也就是說,未找到重復(fù)),則返回 nil。
71 array.unshift(obj, ...)
把對象前置在數(shù)組的前面,其他元素上移一位。
72 array.values_at(selector,...)
返回一個數(shù)組,包含 self 中與給定的 selector(一個或多個)相對應(yīng)的元素。選擇器可以是整數(shù)索引或者范圍。
73 array.zip(arg, ...) [or]
array.zip(arg, ...){ | arr | block }

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

數(shù)組 pack 指令

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

指令 描述
@ 移動到絕對位置。
A ASCII 字符串(填充 space,count 是寬度)。
a ASCII 字符串(填充 null,count 是寬度)。
B 位字符串(降序)
b 位字符串(升序)。
C 無符號字符。
c 字符。
D, d 雙精度浮點數(shù),原生格式。
E 雙精度浮點數(shù),little-endian 字節(jié)順序。
e 單精度浮點數(shù),little-endian 字節(jié)順序。
F, f 單精度浮點數(shù),原生格式。
G 雙精度浮點數(shù),network(big-endian)字節(jié)順序。
g 單精度浮點數(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 指向一個結(jié)構(gòu)(固定長度的字符串)。
p 指向一個空結(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 向后跳過一個字節(jié)。
x Null 字節(jié)。
Z 與 a 相同,除了 null 會被加上 *。

實例

嘗試下面的實例,壓縮各種數(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

公眾號
微信公眾號

編程獅公眾號