你已經學過了陣列。在你學習“`while`?迴圈的時候,你對陣列進行過「pushed」動作,而且將陣列的內容印了出來。另外你應該還在加分習題裡研究過 Ruby 文件,看了陣列支援的其他操作。這已經是一段時間以前了,所以如果你不記得了的話,就回到本書的前面再複習一遍吧。
找到了嗎?還記得嗎?很好。那時候你對一個陣列執行了?`push`?函式。不過,你也許還沒有真正明白發生的事情,所以我們再來看看我們可以對陣列進行什麼樣的操作。
當你看到像?`mystuff.append('hello')`這樣的程式時,你事實上已經在 Ruby 內部激發了一個連鎖反應。以下是它的運作原理:
1. Ruby 看到你用到了?`mystuff`,於是就去找到這個變數。也許它需要倒著檢查看你有沒有在哪裡用?`=`?建立過這個變數,或者檢查它是不是一個函式參數,或者看它是不是一個全局變數。不管哪種方式,它得先找到?`mystuff`?這個變數才行。
2. 一旦它找到了?`mystuff`,就輪到處理句點?`.`?(period)這個操作符號,而且開始查看?`mystuff`?內部的一些變數了。由於?`mystuff`?是一個陣列,Ruby 知道?`mystuff`?支援一些函式。
3. 接下來輪到了處理?`push`。Ruby會將 「push」和?`mystuff`?支援的所有函式的名稱一一對比,如果確實其中有一個叫?`push`?的函式,那麼Ruby就會去使用這個函式。
4. 接下來Ruby看到了括號(parenthesis)並且意識到, 「噢,原來這應該是一個函式」,到了這裡,它就正常會呼叫這個函式了,不過這裡的函式還要多一個參數才行。
一下子要消化這麼多可能有點難度,不過我們將做幾個練習,讓你頭腦中有一個深刻的印象。下面的練習將字符串和列表混在一起,看看你能不能在裡邊找出點樂子來:
~~~
ten_things = "Apples Oranges Crows Telephone Light Sugar"
puts "Wait there's not 10 things in that list, let's fix that."
stuff = ten_things.split(' ')
more_stuff = %w(Day Night Song Frisbee Corn Banana Girl Boy)
while stuff.length != 10
next_one = more_stuff.pop()
puts "Adding: #{next_one}"
stuff.push(next_one)
puts "There's #{stuff.length} items now."
end
puts "There we go: #{stuff}"
puts "Let's do some things with stuff."
puts stuff[1]
puts stuff[-1] # whoa! fancy
puts stuff.pop()
puts stuff.join(' ') # what? cool!
puts stuff.values_at(3,5).join('#') # super stellar!
~~~
## 你應該看到的結果
~~~
$ ruby ex39.rb
Wait there's not 10 things in that list, let's fix that.
Adding: Boy
There's 7 items now.
Adding: Girl
There's 8 items now.
Adding: Banana
There's 9 items now.
Adding: Corn
There's 10 items now.
There we go: ["Apples", "Oranges", "Crows", "Telephone", "Light", "Sugar", "Boy", "Girl", "Banana", "Corn"]
Let's do some things with stuff.
Oranges
Corn
Corn
Apples Oranges Crows Telephone Light Sugar Boy Girl Banana
Telephone#Sugar
$
~~~
## 加分習題
1. 上網閱讀一些關於「物件導向程式(Object Oriented Programming)」的資料。暈了吧?嗯,我以前也是。別擔心。你將從這本書學到足夠用的關於物件導向程式的基礎知識,而以後你還可以慢慢學到更多。
2. `something.methods`?和 something的 class 有什麼關係?
3. 如果你不知道我講的是些什麼東西,別擔心。程式設計師為了顯得自己聰明,於是就發明了Opject Oriented Programming,簡稱為OOP,然後他們就開始濫用這個東西了。如果你覺得這東西太難,你可以開始學一下「函式式程式(functional programming)」。
- 笨方法更簡單
- 習題 0: 準備工作
- 習題 1: 第一個程式
- 習題 2: 注釋和井號
- 習題 3: 數字和數學計算
- 習題 4: 變數(variable)和命名
- 習題 5: 更多的變數和印出
- 習題 6: 字串(string)和文字
- 習題 7: 更多印出
- 習題 8: 印出,印出
- 習題 9: 印出,印出,印出
- 習題 10: 那是什么?
- 習題 11: 提問
- 習題 12: 模組 (Module)
- 習題 13: 參數、解包、參數
- 習題 14: 提示和傳遞
- 習題 15: 讀取檔案
- 習題 16: 讀寫檔案
- 習題 17: 更多的檔案操作
- 習題 18: 命名、變數、程式碼、函式
- 習題 19: 函式和變數
- 習題 20: 函式和檔案
- 習題 21: 函式可以傳回東西
- 習題 22: 到現在你學到了哪些東西?
- 習題 23: 閱讀一些程式碼
- 習題 24: 更多練習
- 習題 25: 更多更多的練習
- 習題 26: 恭喜你,現在來考試了!
- 習題 27: 記住邏輯關系
- 習題 28: 布林(Boolean)表示式練習
- 習題 29: 如果(if)
- 習題 30: Else 和 If
- 習題 31: 做出決定
- 習題 32: 回圈和陣列
- 習題 33: While 回圈
- 習題 34: 存取陣列里的元素
- 習題 35: 分支 (Branches) 和函式 (Functions)
- 習題 36: 設計和測試
- 習題 37: 復習各種符號
- 習題 38: 閱讀程式碼
- 習題 39: 陣列的操作
- 習題 40: Hash, 可愛的 Hash
- 習題 41: 來自 Percal 25 號行星的哥頓人(Gothons)
- 習題 42: 物以類聚
- 習題 43: 你來制作一個游戲
- 習題 44: 評估你的游戲
- 習題 45: 物件、類和從屬關系
- 習題 46: 一個專案骨架
- 習題 47: 自動化測試
- 習題 48: 更進階的使用者輸入
- 習題 49: 創造句子
- 習題 50: 你的第一個網站
- 習題 51: 從瀏覽器中取得輸入
- 習題 52: 創造你的網頁游戲
- 下一步
- 一個老程式設計師的建議