## 6.數組
陣列可以視為機架。 你可以將任何東西 1 放在機架中,以類似的方式可以將任何東西放在陣列中。 一個機架包含許多架子或隔層。 如果你可以數數,則可以在每個隔間上放置數字,可以認為機架是用于存儲某些東西的空間陣列。 每個隔間可以用數字標識,因此易于識別。 陣列是可供程序員使用的機架。 讓我們看一個示例以了解更多信息。 在下面輸入程序并執行
```rb
# array.rb
my_array = []
my_array << "Something"
my_array << 123
my_array << Time.now
my_array.each do |element|
puts element
end
```
這就是你將獲得輸出的方式
```rb
Something
123
Tue Feb 02 18:10:06 +0530 2010
```
讓我們遍歷程序,以`my_array = []`行,在其中聲明一個名為`my_array`的數組,它是一個沒有任何內容的空數組。 `[]`表示一個空數組,我們將其分配給`my_array`。 這樣做后,我們在以下語句中填充一些值
```rb
my_array << "Something"
my_array << 123
my_array << Time.now
```
我們將元素追加到數組。 在第一條語句中,我們附加字符串常量`“Something”`,在第二條語句中,我們附加整數`123`,在第三條語句中,我們附加當前時間。 如果你猜對了,我們已經使用`<<`運算符將值附加到數組。
到現在為止,我們已經創建了一個名為`my_array`的數組,并將其放入其中。 現在,我們必須查看所輸入的內容。為此,我們使用`<array_name>.each`(每個數組名稱點一個點)。 此方法提取數組的每個元素。 因此,對于 my_array,我們使用`my_array.each`
好了,我們必須對數組的每個元素做一些事情。 為此,我們添加了`do … end`,我們可以在其中進行某些操作,因此我們的代碼將轉換為
```rb
my_array.each do
end
```
我們必須將數組的每個元素捕獲到一個變量中,讓我們使用名為`element`的變量來完成這項工作,因此我們使用以下代碼捕獲每個元素
```rb
my_array.each do |element|
end
```
注意我們如何將`element`變量放在`|`和`|`之間。 我們已經捕獲了數組的每個元素,現在該怎么辦? 我們將使用`puts`語句打印它。 這樣我們的數組就可以成功打印了。 以下程序也與以前的程序相同,但是我們使用`Array.new`而不是`[]`來表示`my_array`是一個數組 <sup class="footnote">[ [23](#_footnotedef_23 "View footnote.") ]</sup>
```rb
# array_1.rb
my_array = Array.new
my_array << "Something"
my_array << 123
my_array << Time.now
my_array.each do |element|
puts element
end
```
我將編寫另一個程序,該程序將使用`for`構造遍歷數組的每個元素,如下所示
```rb
# array_2.rb
my_array = Array.new
my_array << "Something"
my_array << 123
my_array << Time.now
for element in my_array
puts element
end
```
輸出量
```rb
Something
123
2012-08-10 19:19:47 +0530
```
還有第三種創建數組的方法。 請仔細查看下面的程序。 看`my_array = [ "Something", 123, Time.now ]`。 仔細看,我們有`my_array`那是一個我們要為其分配數組的變量,其設置為`[ "Something", 123, Time.now ]`。 也就是說,在這種情況下,我們在同一條語句中聲明并向`my_array`添加了數組元素或值。 請注意,我們將數組的元素放在方括號中,這是聲明和填充數組的另一種方法。 因此,程序 [array_3.rb](code/array_3.rb) 的工作原理與 [array_1.rb](code/array_1.rb) 和 [array.rb](code/array.rb) 完全相同,但更加簡潔。 與許多語言不同,Ruby 讓程序員選擇自己的編碼風格。
```rb
# array_3.rb
my_array = [ "Something", 123, Time.now ]
puts my_array.join("\n")
```
Output
```rb
Something
123
Wed Feb 03 17:37:36 +0530 2010
```
直到最后一個示例,我們使用每個示例來循環訪問數組元素,現在我們將使用一種新的循環,即`for`循環,因此這里是一個代碼
```rb
# array_for.rb
my_array = Array.new
my_array.push("Something")
my_array.push 123
my_array << Time.now
for element in my_array
puts element
end
```
Output
```rb
Something
123
2014-11-12 10:37:22 +0530
```
請參閱上面我們采用的新構造,這是:
```rb
for element in my_array
puts element
end
```
注意這一行`for element in my_array`。 這等效于`my_array.each |element` | 在前面的示例中。 `for`循環我個人覺得有點優雅。 因此,就像`each`一樣,`my_array`中的每個元素都被加載到`element`中,這在循環塊中可供程序員使用。 在這里,我們只使用`puts element`打印它。
### 6.1。 有關陣列的更多信息
現在讓我們看一些數組函數。 為此,我們將使用我們最喜歡的 irb 而不是文本編輯器
```rb
>> array = Array.new
=> []
```
好的,在上面的語句中,我們看到我們使用`Array.new`創建了一個名為`array`的數組。 `Array.new`創建一個空數組。 還有另一種創建數組的方法。 我們可以通過直接指定數組中包含的值來創建它,如下所示
```rb
>> array = ["Something", 123, Time.now]
=> ["Something", 123, Tue Feb 02 20:30:41 +0530 2010]
```
在上面的語句中,我們創建了一個包含三個對象的數組。 必須在數組中的值在方括號`[`和`]`之間給出。 數組中的每個對象都用逗號分隔。 通過不提供`[`和`]`之間的值,我們甚至可以創建一個空數組,如下所示
```rb
>> array = []
=> []
```
在上面的示例中,空白`[]`與 Array.new 的工作相同。
讓我們使用`Array.new`中的參數創建數組,如下所示
```rb
>> array = Array.new("Something", 123, Time.now)
ArgumentError: wrong number of arguments (3 for 2)
from (irb):3:in `initialize'
from (irb):3:in `new'
from (irb):3
from :0
```
如你所見,它失敗了! 不要那樣使用。
好的,現在讓我們在`array`上進行一些嘗試,首先要獲取`array`中有多少個元素,我們可以使用`length`函數,如下所示:
```rb
>> array.length
=> 3
```
`join`函數將許多數組元素連接在一起并返回它。 因此,當將數組中的元素連接在一起時,這就是結果:
```rb
>> array.join(', ')
=> "Something, 123, Tue Feb 02 20:30:41 +0530 2010"
```
請注意,當數組元素作為字符串連接時,我們將字符串`', '`傳遞給`join`。 我們傳遞的字符串將插入它們之間。
我們已經創建了一個數組,并且其中包含一些東西,如果我們想添加一些東西,該怎么辦? 為此,我們使用`push`方法。 在下面的示例中,我們將數字 5 推入`array`,然后看到數組得到擴展,最后將 5 附加到`array`。
```rb
>> array.push(5)
=> ["Something", 123, Tue Feb 02 20:30:41 +0530 2010, 5]
```
`pop`方法的作用與`push`相反,它彈出或刪除數組的最后一個元素。 參見下面的示例,我們彈出一個元素,然后彈出最后一個元素 5。
```rb
>> array.pop
=> 5
```
彈出后,讓我們看看`array`中的內容
```rb
>> array
=> ["Something", 123, Tue Feb 02 20:30:41 +0530 2010]
```
我們看到數組大小減少了一個,最后一個元素 5 丟失了。
它不是只需要在`push`中給出固定值,而是可以將變量和 Ruby 表達式以及任何對象作為參數提供給 push。 你可以在下面看到我們將 2 提升到 10 的冪到數組,最后將 1024 添加到數組。
```rb
>> array.push 2**10
=> ["Something", 123, Tue Feb 02 20:30:41 +0530 2010, 1024]
```
索引數組元素。 數組的第一個元素的索引號為 0,并且繼續(理論上一直到無窮大)。 如果要訪問索引中的元素,則他要做的就是將索引號放在方括號之間。 在下面的示例中,我們訪問名為`array`的數組的第三個元素,因此我們將其鍵入如下
```rb
>> array[2]
=> Tue Feb 02 20:30:41 +0530 2010
```
`pop`方法接受一個 I??nteger 作為參數,用于彈出`n`數組的最后一個元素。
```rb
>> array.pop(2)
=> [Tue Feb 02 20:30:41 +0530 2010, 1024]
>> array
=> ["Something", 123]
```
如你所見,第三個元素被彈出,因此可以隨機彈出。
我們可以一次將許多元素推入數組。 考慮下面的代碼片段
```rb
>> array.push 5, "Who am I?", 23.465*24
=> ["Something", 123, 5, "Who am I?", 563.16]
```
我們首先將 3 個新元素推入數組,然后得到一個更大的元素。
現在我們彈出最后 3 個元素
```rb
>> array.pop 3
=> [5, "Who am I?", 563.16]
```
如你所見,數組的大小減小了,現在只有兩個元素。
```rb
>> array
=> ["Something", 123]
```
還有另一種在數組中追加元素的方法,它使用小于運算符`<<`的 double,使一些元素隨其推入數組,如下所示:
```rb
>> array << "a new element"
=> ["Something", 123, "a new element"]
>> array << 64
=> ["Something", 123, "a new element", 64]
```
如你在上面看到的,我們使用`<<`運算符將字符串常量`“a new element”`和`64`附加到數組。
你可以使用`max`和`min`函數在數組中找到最大值和最小值,如下所示:
```rb
>> nums = [1, 2, 64, -17, 5 ,81]
=> [1, 2, 64, -17, 5, 81]
>> nums.max
=> 81
>> nums.min
=> -17
```
如上例所示,我們創建了一個名為`nums`的數組,其中包含一些數字,`nums.max`返回該數組中的最大值,`nums.min`返回該數組中的最小值。
### 6.2。 數組挖掘
看一下在 irb 中執行的一個簡單代碼段,我們有一個嵌套數組,可以說我們要訪問字符串元素`“Treasure”`,可以使用 dig 方法,如下所示
```rb
>> array = [1, 5, [7, 9, 11, ["Treasure"], "Sigma"]]
=> [1, 5, [7, 9, 11, ["Treasure"], "Sigma"]]
>> array.dig(2, 3, 0)
=> "Treasure"
```
### 6.3。 設定操作
對于那些了解集合論的人,你必須了解交集,并集。 我在學校時讀過關于集合論的文章,??但現在已經忘記了。 你可以將數組視為集合并對其執行許多操作。 以下是一些我在 irb 上試過的例子,讓我們參加一個大學排球隊,其中有些人叫 Ashok,Chavan,Karthik,Jesus 和 Budha。 如果你列出板球隊的名單,那就有 Budha,Karthik,Ragu 和 Ram。 現在讓我們用 ruby 對其進行編碼。 為了收集排球隊成員,我們創建了一個數組,如下所示
```rb
>> volleyball=["Ashok", "Chavan", "Karthik", "Jesus", "Budha"]
=> ["Ashok", "Chavan", "Karthik", "Jesus", "Budha"]
```
以類似的方式,我們創建了另一個數組,其中包含板球隊中球員的姓名,如下所示
```rb
>> cricket=["Budha", "Karthik", "Ragu", "Ram"]
=> ["Budha", "Karthik", "Ragu", "Ram"]
```
因此,我們有兩組人。 現在要找出誰在排球和板球運動中,我們所需要做的就是使用&運算符對兩個數組進行 AND(或取交)
```rb
>> volleyball & cricket
=> ["Karthik", "Budha"]
```
從上面的代碼片段中可以看到,`&`(和)運算符會嗅出兩個數組中都存在的那些元素。 在數學中,這種東西稱為交集。
讓我們說在另一種情況下,我們想找出所有排球和板球隊的人。 為此,我們使用 or 運算符`|`。 現在應用它
```rb
>> volleyball | cricket
=> ["Ashok", "Chavan", "Karthik", "Jesus", "Budha", "Ragu", "Ram"]
```
如你所見,我們獲得了排球隊和板球隊成員的名字。 | (或)運算符不同于+(加號)運算符。 讓我們增加排球隊和板球隊
```rb
>> volleyball + cricket
=> ["Ashok", "Chavan", "Karthik", "Jesus", "Budha", "Budha", "Karthik", "Ragu", "Ram"]
```
從上面的代碼片段中可以看到,名稱 Karthik 和 Budha 是重復的。 當我們使用|時,這不會發生。 (OR)運算符。
現在讓我們找出哪些球員只為排球隊效力。 為此,我們將使用`–`(減號)運算符減去排球隊的板球運動員,如下所示
```rb
>> volleyball - cricket
=> ["Ashok", "Chavan", "Jesus"]
```
因此,我們看到排球隊中只有三名球員。 因此,如果你是數學家,你會對 Ruby 感到滿意。
### 6.4。 空數組為真
Ruby 開發人員還必須了解其他內容。 它關于條件和空數組。 啟動你的 irb 并輸入
```rb
>> puts "A" if []
A
=> nil
```
如果你看到的話,即使傳遞給`if`語句的數組為空,該語句也會打印 A。 這有點違背了最不令人驚訝的理論,但是請不要感到驚訝。 有一個書架,里面有書,所以如果你這樣說
```rb
>> puts "Books Present" if ["treasure island", "I Love Ruby"]
Books Present
=> nil
```
它確實按預期方式打印 Books Present。 但是在這件事上
```rb
>> puts "Books Present" if []
Books Present
=> nil
```
它仍然會打印有書本。 那是因為即使書架是空的,也有一個仍然是物體的書架。 因此,有些事情不是`nil`。 因此,它是`true`。 為確保其工作原理,請看下面的代碼
```rb
>> nil.class
=> NilClass
>> [].class
=> Array
```
當我們查詢什么是`nil`的類時,它表示其`NilClass`實際上是一個空東西。 但是,當我們查詢空數組的類時,它仍然是`Array`,而不是`nil`或`false`,因此不是`true`。 檢查必須執行的空數組
```rb
>> puts "A" unless [].empty?
=> nil
>> puts "A" if [].first
=> nil
```
在第一個中,`[].empty?`返回`true`,但是由于它在`unles`中,因此將無法執行依賴于它的語句。
如果看到第二個我們使用`[].first`,則返回`nil`。 在 irb 中嘗試
```rb
>> [].first
=> nil
```
因此,這也可以用于檢查數組是否為空。 還是這樣.....?
```rb
>> a= [ nil, 1, 2, nil]
=> [nil, 1, 2, nil]
>> puts "a is empty" unless a.first
=> a is empty
>> puts "a is not empty" if a.first
=> nil
>> puts "a is not empty" unless a.empty?
a is not empty
=> nil
```
不用考慮天氣還是不使用`first`檢查空度?
### 6.5。 壓縮陣列
有時一個數組可能包含`nil`值,而你想刪除它,在這種情況下,你可以在該數組上調用`compact`。 讓我們嘗試一個例子。 啟動你的 irb 或 pry,然后輸入以下內容
首先讓我們初始化數組
```rb
>> a = [1, nil, 2, nil, 3, nil]
=> [1, nil, 2, nil, 3, nil]
```
因此,在上面的語句中,我們使用三個`nil`值初始化了數組。 現在,如下所示通過壓縮將`nil`值刪除
```rb
>> a.compact
=> [1, 2, 3]
```
涼! 因此,紅寶石刪除了`nil`值,例如魔術。 現在讓我們看看`a`的樣子
```rb
>> a
=> [1, nil, 2, nil, 3, nil]
```
令我們沮喪的是,仍然保留了零值,真正發生了什么? 好吧,當你在`a`上調用 compact 時,將創建一個新的壓縮數組,并將其返回給我們的 REPL <sup class="footnote">[ [24](#_footnotedef_24 "View footnote.") ]</sup> ,然后 REPL 將其打印出來。 那么如何使`a`真正改變呢? 如下所示,帶有 bang 或`compact!`的簡單調用緊湊型;)
```rb
>> a.compact!
=> [1, 2, 3]
>> a
=> [1, 2, 3]
```
### 6.6。 轉換數組值
Ruby 帶有非常強大的數組操作,我們將看到如何在易于使用的命令中轉換數組。
#### 6.6.1。 收藏
火起來你的撬或 irb 并輸入以下內容
```rb
>> array = [1, 2, 3]
=> [1, 2, 3]
>> array.collect{ |element| element * element }
=> [1, 4, 9]
```
在上面的代碼中,我們聲明了類型為`Array`的變量`array`,在下一條語句中,我們在其上調用了名為`collect`的方法,并傳遞了此代碼塊`{ |element| element * element }`。 現在讓我們看看它的作用。
調用`collect`時,首先創建一個返回數組。 在該塊中,我們看到了一個名為`|element|`的東西,現在 collect 算法的工作原理如下。 首先,此數組具有值 1、2 和 3,因此此塊運行 3 次。 在第一次運行期間,將 1 裝入`element`,現在在塊中我們指定了`element * element`,因此`1 * 1`為`1`,并將其壓入返回數組。 現在返回數組為`[1]`。
現在,它取第二個值,即 2,并且發生相同的過程,現在返回數組為`[1, 4]`,類似地,返回數組最終變為`[1, 4, 9]`并返回。
`collect`不會修改調用它的對象,因此,如果你查看`array`是什么,它仍將與下面的顯示相同
```rb
>> array
=> [1, 2, 3]
```
你可以在 irb 中檢查它。 如果要收集以修改被調用的對象,請使用爆炸符號,如下所示
```rb
>> array.collect!{ |element| element * element }
=> [1, 4, 9]
>> array
=> [1, 4, 9]
```
#### 6.6.2。 keep_if
假設我們要在數組中具有匹配特定條件的元素,并想刪除其他條件,我們可以使用`keep_if`函數,如下所示
```rb
>> array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>> array.keep_if{ |element| element % 2 == 0}
=> [2, 4, 6, 8, 10]
```
我們上面有一個由十個元素組成的數組,并說我們要保持偶數或被 2 整除的元素,因此我們將其寫為如下所示的語句
```rb
array.keep_if{ |element| element % 2 == 0}
```
我們向`keep_if`傳遞了一個塊。 其中,數組中的每個值都在`|element|`中捕獲,并寫入了條件`element % 2 == 0`,如果條件為 true,則該元素將保留在數組中,否則將其拋出。 `keep_if`修改了其調用的數組,與之不同的是,collect 返回新數組。 因此,如果在運行`keep_if`之后檢查數組,其內容將發生更改。
#### 6.6.3。 delete_if
與`keep_if`相對,`delete_if`的作用恰好相反,下面顯示了如果在 Array 對象上運行`delete_if`會發生什么。
```rb
>> array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>> array.delete_if{ |element| element % 2 == 0}
=> [1, 3, 5, 7, 9]
>> array
=> [1, 3, 5, 7, 9]
```
### 6.7。 閱讀紅寶石文檔
毫無疑問,這本書不夠全面,無法涵蓋所有??Ruby Array 庫。 要了解更多信息,請在此處閱讀 Ruby 文檔 [https://ruby-doc.org/core-2.5.1/Array.html](https://ruby-doc.org/core-2.5.1/Array.html)
- 前言
- 紅寶石
- 先決條件
- 1.安裝 Ruby
- 2.在線資源
- 3.入門
- 4.比較與邏輯
- 5.循環
- 6.數組
- 7.哈希和符號
- 8.范圍
- 9.功能
- 10.可變范圍
- 11.類&對象
- 12.安全導航
- 13.打破大型程序
- 14.結構和 OpenStruct
- 15. Rdoc
- 16. Ruby 樣式指南
- 17.模塊和混入
- 18.日期和時間
- 19.文件
- 20. Proc,Lambda 和塊
- 21.多線程
- 22.異常處理
- 23.正則表達式
- 24.寶石
- 25.元編程
- 26.基準
- 27.測試驅動開發
- 28.觀察者模式
- 29.模板模式
- 30.工廠模式
- 31.裝飾圖案
- 32.適配器模式
- 33.單例模式
- 34.復合模式
- 35.建造者模式
- 36.策略模式
- 贊助商
- 捐
- 人們怎么說
- 版權
- 取得這本書