你在上一節中發現 Hash 的秘密功能了嗎?你可以解釋給自己嗎?讓我來給你解釋一下,順便和你自己的理解對比看有什麼不同。這裡是我們要討論的程式碼:
1 2 |
|
你要記住一個函式也可以作為一個變數,為了要將一個程式碼區段儲存在一個變數裡,我們創造了一個東西叫「proc」,proc 是 procedure 縮寫。在這段程式碼中,首先我們呼叫了 Ruby 內建的函式 method
,它會回傳一個 proc 版的 find_city
函式。然後我們將之除存在一個 Hash 裡:key 是 :find
,value 是 cities
。。這和我們將州和市關聯起來的程式碼做的事情一樣,只不過在這個情況裡是個 proc。
好了,所以一旦我們知道 find_city
是在Hash中 :find
的位置,這就意味著我們可以去呼叫它。第二行程式碼可以分解成如下步驟:
- Ruby 讀到了
cities
,然後知道了它是一個 「Hash」。 - 然後看到了
[:find]
,於是 Ruby 就從索引找到了 cities Hash 中對應的位置,並且獲取了該位置的內容。 [:find]
這個位置的內容是我們的函式find_city
,所以Ruby就知道了這裡表示一個函式,於是當它碰到.call
就開始了 proc呼叫。cities
、state
這兩個參數將被傳遞到函式find_city
中,然後這個函式就被運行了。find_city
接著從cities
中尋找states
,並且回傳它找到的內容,如果什麼都沒找到,就返回一個信息說它什麼都沒找到。- Ruby 接受
find_city
傳回的資訊,最後將該資訊賦值給一開始的city_found
這個變數。
我再教你一個小技巧。如果你倒著閱讀的話,程式碼可能會變得更容易理解。讓我們來試一下,一樣是那行:
state
和city
是…- 最為參數傳遞給…
- 一個 proc 位於…
:find
然後尋找,目的地為…cities
這個 Hash…- 最後印到螢幕上
還有一種方法讀它,這回是「由裡向外」。
- 找到表示式的中心位置,此次為
[:find]
。 - 逆時針追溯,首先看到的是一個叫
cities
的 Hash,這樣就知道了cities
中的:find
元素。 - 上一步得到一個函式。繼續逆時針尋找,看到的是參數。
- 參數傳遞給函式後,函式會傳回一個值。然後再逆時針尋找。
- 最後,我們到了
city_found
=的賦值位置,並且得到了最終結果。
數十年的程式經驗下來,我在讀程式碼的過程中已經用不到上面的三種方法了。我只要瞄一眼就能知道它的意思。甚至給我一整頁的程式碼,我也可以一眼瞄出裡邊的 bug 和錯誤。這樣的技能是花了超乎常人的時間和精力才鍛煉得來的。在磨練的過程中,我學會了下面三種讀程式碼的方法:
- 從前向後。
- 從後向前。
- 逆時針方向。
現在我們來寫這次的練習,寫完後再過一遍,這節習題其實挺有趣的。
程式碼不少,不過還是從頭寫完吧。確認它能運行,然後玩一下看看。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 |
|
你應該看到的結果
$ ruby ex41.rb
--------
The Gothons of Planet Percal #25 have invaded your ship and destroyed
your entire crew. You are the last surviving member and your last
mission is to get the neutron destruct bomb from the Weapons Armory,
put it in the bridge, and blow the ship up after getting into an
escape pod.
You're running down the central corridor to the Weapons Armory when
a Gothon jumps out, red scaly skin, dark grimy teeth, and evil clown costume
flowing around his hate filled body. He's blocking the door to the
Armory and about to pull a weapon to blast you.
> dodge!
Like a world class boxer you dodge, weave, slip and slide right
as the Gothon's blaster cranks a laser past your head.
In the middle of your artful dodge your foot slips and you
bang your head on the metal wall and pass out.
You wake up shortly after only to die as the Gothon stomps on
your head and eats you.
--------
Such a luser.
$ ruby ex41.rb
--------
The Gothons of Planet Percal #25 have invaded your ship and destroyed
your entire crew. You are the last surviving member and your last
mission is to get the neutron destruct bomb from the Weapons Armory,
put it in the bridge, and blow the ship up after getting into an
escape pod.
You're running down the central corridor to the Weapons Armory when
a Gothon jumps out, red scaly skin, dark grimy teeth, and evil clown costume
flowing around his hate filled body. He's blocking the door to the
Armory and about to pull a weapon to blast you.
> tell a joke
Lucky for you they made you learn Gothon insults in the academy.
You tell the one Gothon joke you know:
Lbhe zbgure vf fb sng, jura fur fvgf nebhaq gur ubhfr, fur fvgf nebhaq gur ubhfr.
The Gothon stops, tries not to laugh, then busts out laughing and can't move.
While he's laughing you run up and shoot him square in the head
putting him down, then jump through the Weapon Armory door.
--------
You do a dive roll into the Weapon Armory, crouch and scan the room
for more Gothons that might be hiding. It's dead quiet, too quiet.
You stand up and run to the far side of the room and find the
neutron bomb in its container. There's a keypad lock on the box
and you need the code to get the bomb out. If you get the code
wrong 10 times then the lock closes forever and you can't
get the bomb. The code is 3 digits.
[keypad]> 123
BZZZZEDDD!
[keypad]> 234
BZZZZEDDD!
[keypad]> 345
BZZZZEDDD!
[keypad]> 456
BZZZZEDDD!
[keypad]> 567
BZZZZEDDD!
[keypad]> 678
BZZZZEDDD!
[keypad]> 789
BZZZZEDDD!
[keypad]> 384
BZZZZEDDD!
[keypad]> 764
BZZZZEDDD!
[keypad]> 354
BZZZZEDDD!
[keypad]> 263
The lock buzzes one last time and then you hear a sickening
melting sound as the mechanism is fused together.
You decide to sit there, and finally the Gothons blow up the
ship from their ship and you die.
--------
You died. You kinda suck at this.
加分習題
- 解釋一下返回至下一個房間的運作原理。 2.建立更多的房間,讓遊戲規模變大。
- 除了讓每個函式印出自己以外,試試學習一下「文件註解(doc comments)」。
- 看看你能不能將房間描述寫成文件註解,然後修改運行它的程式碼,讓它把文檔註解打印出來。
- 一旦你用了文件註解作為房間描述,你還需要讓這個函式打出用戶提示嗎?試著讓運行函數的代碼打出用戶提示來,然後將用戶輸入傳遞到各個函式。你的函式應該只是一些
if
語句組合,將結果印出來,並且返回下一個房間。 - 這其實是一個小版本的「有限狀態機(finite state machine)」,找資料閱讀了解一下,雖然你可能看不懂,但還是找來看看吧