iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 4
1
自我挑戰組

Ruby菜鳥村村民遊記系列 第 4

遊記ep.4 處處是危機的Ruby村

身為菜鳥村村民在寫 code 的時候,最不會少的就是碰到出錯
尤其一開始什麼都不懂,一看到一長串的訊息,還以為是不是做錯了什麼觸怒了村長,
但其實剛好相反,Ruby村村長反而對外來者的我們保護得很周到,會很細心的告訴我們,
是不是根本沒有去定義一個變數或方法?
是不是方法名稱打錯了,有時候甚至會很好心的提示我們正確的名稱。
亦或者是根本搞錯了Ruby村的語法,很常見於又少了某一種括號之類的。

2.6.3 :001 > a
Traceback (most recent call last):
        4: from /Users/Bunny/.rvm/rubies/ruby-2.6.3/bin/irb:23:in `<main>'
        3: from /Users/Bunny/.rvm/rubies/ruby-2.6.3/bin/irb:23:in `load'
        2: from /Users/Bunny/.rvm/rubies/ruby-2.6.3/lib/ruby/gems/2.6.0/gems/irb-1.0.0/exe/irb:11:in `<top (required)>'
        1: from (irb):1
NameError (undefined local variable or method `a' for main:Object)
2.6.3 :002 >

很常發生的錯誤訊息,因為根本沒有去定義 a 這個變數的內容,所以當我們去呼叫 a 的時候
Ruby村村長就會回應我們"笑年ㄟ,你是不是忘記幫 a 做點什麼事情了啊?"

2.6.3 :006 > a.maple{|x| x * 2}
Traceback (most recent call last):
        5: from /Users/Bunny/.rvm/rubies/ruby-2.6.3/bin/irb:23:in `<main>'
        4: from /Users/Bunny/.rvm/rubies/ruby-2.6.3/bin/irb:23:in `load'
        3: from /Users/iBunny/.rvm/rubies/ruby-2.6.3/lib/ruby/gems/2.6.0/gems/irb-1.0.0/exe/irb:11:in `<top (required)>'
        2: from (irb):6
        1: from (irb):6:in `rescue in irb_binding'
NoMethodError (undefined method `maple' for [1, 2, 3, 4, 5, 6]:Array)
Did you mean?  map
               sample
               map!

現在我們幫 a 弄了一個陣列給他,我們想讓 a 去引用 map 這個方法,結果手滑打錯了字
這個時候溫馨的村長又出現了!而且這次還直接為我們指引了三條道路呢,
看來村長真的是很了解每個村民的需求呀。

2.6.3 :005 > a.map{|x| x * 2}}
Traceback (most recent call last):
        3: from /Users/iambunny/.rvm/rubies/ruby-2.6.3/bin/irb:23:in `<main>'
        2: from /Users/iambunny/.rvm/rubies/ruby-2.6.3/bin/irb:23:in `load'
        1: from /Users/iambunny/.rvm/rubies/ruby-2.6.3/lib/ruby/gems/2.6.0/gems/irb-1.0.0/exe/irb:11:in `<top (required)>'
SyntaxError ((irb):5: syntax error, unexpected tSTRING_DEND, expecting end)
...scue _.class; a.map{|x| x * 2}}
...                              ^

現在我們給了 a 這個容器一個陣列,也讓 a 引用了對的 map 方法來做運算,
咦?!怎麼還是出錯了?
和藹的村長知道我們雖然是個小87,但還是覺得我們有藥醫,
隨手一伸,又將他的一根手指比在某處,彷彿就在跟你說:"你不覺得這裡多了什麼嗎?"

2.6.3 :007 > a.map{|x| x * 2}
 => [2, 4, 6, 8, 10, 12]

於是費了好一些功夫,我們終於成功的執行了這段 code。

程式語言某個程度來說,醍醐味就是在debug,面對成千上萬的方法、迴圈,
即使是身經百戰的老手,也都有出錯的時候,又更何況是我們這種寫不到三個月的菜鳥呢?
差別只在於,他們對於各種錯誤訊息早就已經看膩了,也看得熟了,
瞬間噴出的訊息對他們來說就像是明示一般,照著提示就能順利的解決問題。
相對的我們因為不夠熟練,甚至看到一長串的錯誤訊息,連解讀的勇氣都沒有了,
但其實Ruby在錯誤的訊息上面也給了很多的指示,有的甚至直接告訴你該怎麼做,
也許是對英文的恐懼、也許是不習慣出錯這件事,我們都會下意識地去忽略這些訊息。
教導我的老師也曾經這樣說:有時候寫得太順,會覺得很奇怪,反而會覺得一定是哪裡出錯了沒有發覺。

下次再看到錯誤訊息,不如停下腳步好好多看一眼,也許踩雷的時間就會少了很多呢!


上一篇
遊記ep.3 不思議的Ruby村-2
下一篇
遊記ep.5 DoEnd 與 { } 的Ruby村
系列文
Ruby菜鳥村村民遊記30

尚未有邦友留言

立即登入留言