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