Ruby 數組(Array)


Ruby 陣列是任何物件的有序整數索引集合。數組中的每個元素都與一個索引相關,並可透過索引進行取得。

陣列的索引從 0 開始,這與 C 或 Java 中一樣。一個負數的索相對於數組的末尾計數的,也就是說,索引為 -1 表示數組的最後一個元素,-2 表示數組中的倒數第二個元素,依此類推。

Ruby 陣列可儲存諸如 String、 Integer、 Fixnum、 Hash、 Symbol 等對象,甚至可以是其他 Array 物件。

Ruby 陣列不需要指定大小,當新增元素到陣列時,Ruby 陣列會自動增長。

建立陣列

有多種方式可以建立或初始化陣列。一種方式是透過new 類別方法:

names = Array.new

您可以在建立陣列的同時設定陣列的大小:

names = Array.new(20)

陣列names 的大小或長度為20 個元素。您可以使用size 或length 方法傳回數組的大小:

#!/usr/bin/ruby

names = Array.new(20)
puts names.size  # 返回 20
puts names.length # 返回 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]

陣列還有另一種方法,[],如下所示:

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

陣列所建立的另一種形式如下所示:

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

在Ruby 核心模組中可以有一個只接收單一參數的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

下面是公共的陣列方法(假設 array 是一個 Array 物件):

34353637656667
序號方法& 描述
#1array & other_array
#傳回一個新的數組,包含兩個數組中共同的元素,沒有重複。
2array * int [or] array * str
傳回一個新的數組,新數組透過連接self 的int副本創建的。帶有 String 參數時,相當於 self.join(str)。
3array + other_array
傳回一個新的數組,新數組透過連接兩個數組產生第三個數組創建的。
4array - other_array
傳回一個新的數組,新數組是從初始數組移除了在other_array 中出現的項的副本。
5str <=> other_str
把str 與other_str 比較,回傳-1(小於)、0 (等於)或1(大於)。比較是區分大小寫的。
6array | other_array
透過 other_array 加入 array 中,移除重複項,傳回一個新的陣列。
7array << obj
把給定的物件附加到陣列的結尾。這個表達式會傳回數組本身,所以幾個附加可以連在一起。
8array <=> other_array
如果陣列小於、等於或大於other_array,則傳回一個整數(- 1、 0 或+1)。
9array == other_array
如果兩個陣列包含相同的元素個數,且每個元素與另一個數組中相對應的元素相等(根據Object.==),那麼這兩個數組相等。
10array[index] [or] array[start, length] [or]
array[range] [or] array. slice(index) [or]
array.slice(start, length) [or] array.slice(range)

傳回索引為index 的元素,或傳回從start 開始直到length 個元素的子數組,或傳回range 指定的子數組。負值索引從數組末尾開始計數(-1 是最後一個元素)。如果 index(或開始索引)超出範圍,則傳回 nil
11array[index] = obj [or]
array[start, length] = obj or an_array or nil [or]
array[range] = obj or an_array or nil

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

#為self 中的每個元素呼叫一次block。建立一個新的數組,包含 block 傳回的值。
17array.collect! { |item| block } [or]
array.map! { |item| block }

self 中的每個元素呼叫一次block,把元素替換為block 傳回的值。
18array.compact
#傳回self 的副本,移除了所有的 nil 元素。
19array.compact!
從陣列中移除所有的 nil 元素。如果沒有變更則傳回 nil
20array.concat(other_array)
追加 other_array 中的元素到 self 中。
21array.delete(obj) [or]
array.delete(obj) { block }

#從self 中刪除等於obj 的項目。如果未找到相等項,則傳回 nil。如果找不到相等項且給了可選的程式碼 block,則傳回 block 的結果。
22array.delete_at(index)
刪除指定的index 處的元素,並傳回該元素。如果 index 超出範圍,則傳回 nil
23array.delete_if { |item| block }
block 為true 時,刪除self 的每個元素。
24array.each { |item| block }
#為 self 中的每個元素呼叫一次 block,傳遞該元素作為參數。
25array.each_index { |index| block }
與Array#each 相同,但是傳遞元素的 index,而不是傳遞元素本身。
26array.empty?
如果陣列本身沒有包含元素,則傳回 true。
27array.eql?(other)
如果arrayother 是相同的對象,或兩個陣列帶有相同的內容,則傳回true。
28array.fetch(index) [or]
array.fetch(index, default) [or]
array. fetch(index) { |index| block }

嘗試傳回位置index 處的元素。如果index 位於陣列外部,則第一種形式會拋出IndexError 異常,第二種形式會傳回default,第三種形式會傳回調用block 傳入index 的值。負值的 index 從陣列結尾開始計數。
29array.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 }

前面三種形式設定self 的被選元素為obj。以 nil 開頭相當於零。 nil 的長度相當於 self.length。最後三種形式以 block 的值填滿陣列。 block 透過帶有被填滿的每個元素的絕對索引來傳遞。
30array.first [or]
array.first(n)

傳回陣列的第一個元素或前n 個元素。如果陣列為空,則第一種形式傳回 nil,第二種形式傳回一個空的陣列。
31array.flatten
傳回一個新的數組,新數組是一個一維的扁平化的數組(遞歸)。
32array.flatten!
array 做扁平化。如果沒有變更則傳回 nil。 (陣列不包含子陣列。)
33#array.frozen?##如果
array 被凍結(或排序時暫時凍結),則傳回true。
array.hash計算陣列的雜湊程式碼。兩個具有相同內容的數組將具有相同的哈希代碼。
array.include?(obj)如果
self 中包含obj,則傳回true,否則傳回false。
array.index(obj)傳回
self 中第一個等於obj 的對象的index。如果未找到符合則傳回 nil
array.indexes(i1, i2, ... iN) [or]array.indices(i1, i2, . .. iN)
該方法在 Ruby 的最新版本中被廢棄,所以請使用 Array#values_at。
38array.indices(i1, i2, ... iN) [or]
array.indexes(i1, i2, . .. iN)

該方法在Ruby 的最新版本中被廢棄,所以請使用Array#values_at。
39array.insert(index, obj...)
在給定的index的元素前插入給定的值,index 可以是負值。
40array.inspect
建立一個陣列的可列印版本。
41array.join(sep=$,)
#回傳一個字串,透過把陣列的每個元素轉換為字串,並使用sep 分隔進行建立的。
42array.last [or] array.last(n)
回傳self 的最後一個元素。如果陣列為,則第一種形式傳回 nil
43array.length
傳回 self 中元素的個數。可能為零。
44array.map { |item| block } [or]
array.collect { |item| block }

#為self 的每個元素呼叫一次block。建立一個新的數組,包含 block 傳回的值。
45array.map! { |item| block } [or]
array.collect! { |item| block }

array 的每個元素呼叫一次block,把元素替換為block 傳回的值。
46array.nitems
傳回 self 中 non-nil 元素的個數。可能為零。
47array.pack(aTemplateString)
根據 aTemplateString 中的指令,將陣列的內容壓縮為二進位序列。指令 A、 a 和 Z 後可以跟著一個表示結果欄位寬度的數字。剩餘的指令也可以帶有一個表示要轉換的陣列元素個數的數字。如果數字是一個星號(*),則所有剩餘的陣列元素都會被轉換。任何指令後都可以跟著一條底線(_),表示指定類型使用底層平台的本地尺寸大小,否則使用獨立於平台的一致的尺寸大小。在模板字串中空格會被忽略。
48array.pop
#從array 移除最後一個元素,並傳回該元素。如果 array 為空則回傳 nil
49array.push(obj, ...)
把給定的 obj 附加到陣列的結尾。這個表達式會傳回數組本身,所以幾個附加可以連在一起。
50array.rassoc(key)
搜尋一個數組,其元素也是數組,使用== 把 key 與每個包含的陣列的第二個元素進行比較。如果匹配則傳回第一個包含的陣列。
51array.reject { |item| block }
傳回一個新的數組,包含當 block 不為 true 時的數組項。
52array.reject! { |item| block }
當block 為真時,從array 刪除元素,如果沒有變更則傳回nil。相當於 Array#delete_if。
53array.replace(other_array)
array 的內容替換為other_array 的內容,必要的時間進行截斷或擴充。
54array.reverse
傳回一個新的陣列,包含倒序排列的陣列元素。
55array.reverse!
array 反轉。
56array.reverse_each {|item| block }
與Array#each 相同,但是把array 進行逆轉。
57array.rindex(obj)
傳回 array 中最後一個等於 obj 的物件的索引。如果未找到匹配,則返回 nil
58array.select {|item| block }
呼叫從陣列傳入連續元素的block,傳回一個陣列,包含block 傳回true 值時的元素。
59array.shift
#回傳self 的第一個元素,並移除該元素(把所有的其他元素下移一位)。如果陣列為空,則傳回 nil
60array.size
#傳回 array 的長度(元素的數量)。 length 的別名。
61array.slice(index) [or] array.slice(start, length) [or]
array.slice(range ) [or] array[index] [or]
array[start, length] [or] array[range]

傳回索引為index 的元素,或傳回從start 開始直到length 個元素的子數組,或傳回range 指定的子數組。負值索引從數組末尾開始計數(-1 是最後一個元素)。如果 index(或開始索引)超出範圍,則傳回 nil
62array.slice!(index) [or] array.slice!(start, length) [or]
array.slice !(range)

刪除index(長度是可選的)或range 指定的元素。傳回已刪除的物件、子數組,如果 index 超出範圍,則傳回 nil
63array.sort [or] array.sort { | a,b | block }
傳回一個已排序的陣列。
64array.sort! [or] array.sort! { | a,b | block }##把陣列進行排序。
array.to_a回傳
self。如果在 Array 的子類別上調用,則把接收參數轉換為一個 Array 物件。
array.to_ary回傳 self。
array.to_s返回 self.join。
68array.transpose
假設 self 是數組的數組,且置換行和列。
69array.uniq
#傳回一個新的數組,移除了array 中的重複值。
70array.uniq!
#從 self 移除重複元素。如果沒有變化(也就是說,未找到重複),則傳回 nil
71array.unshift(obj, ...)
把物件前置在陣列的前面,其他元素上移一位。
72array.values_at(selector,...)
傳回一個數組,包含self 中與給定的selector(一個或多個)相對應的元素。選擇器可以是整數索引或範圍。
73array.zip(arg, ...) [or]
array.zip(arg, ...){ | arr | block }

把任何參數轉換成數組,然後把array 的元素與每個參數中相對應的元素合併。

陣列 pack 指令

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

指令描述
#@移到絕對位置。
AASCII 字串(填入 space,count 是寬度)。
aASCII 字串(填入 null,count 是寬度)。
B位元字串(降序)
#b位元字串(升序)。
C無符號字元。
c字元。
D, d雙精確度浮點數,原生格式。
E雙精確度浮點數,little-endian 位元組順序。
e單一精確度浮點數,little-endian 位元組順序。
F, f單一精確度浮點數,原生格式。
G雙精確度浮點數,network(big-endian)位元組順序。
g單一精確度浮點數,network(big-endian)位元組順序。
H十六進位字串(高位元優先)。
h十六進位字串(低位優先)。
I無符號整數。
i整數。
L無符號 long。
lLong。
M引用可列印的,MIME 編碼。
mBase64 編碼字串。
NLong,network(big-endian)位元組順序。
nShort,network(big-endian)位元組順序。
P指向一個結構(固定長度的字串)。
p指向一個空結束字串。
Q, q64 位數。
S無符號 short。
sShort。
UUTF-8。
uUU 編碼字串。
VLong,little-endian 位元組順序。
vShort,little-endian 位元組順序。
wBER 壓縮的整數 \fnm。
X向後跳過一個位元組。
xNull 位元組。
Z與 a 相同,除了 null 會被加上 *。

實例

嘗試下面的實例,壓縮各種資料。

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

以上實例執行輸出結果為:

rrreee