在 Ruby 如何找到方法的定義?

剛好昨天有朋友問到,就順便筆記一下。

Ruby 官方文件很多,但有時對入門的朋友來說,常會遇到「我想看看 XX 方法的詳細用法,我該找哪個類別或模組的文件?」的問題。簡單的說,「常翻文件」就是這個問題最好的答案啦,除此之外,你也可以使用 Object#method 來找。

例如我想要知道 puts 這個很常用的方法是定義在哪邊的:

print method(:puts) # <Method: Object(Kernel)#puts>

它會回傳一個 Method 類別的實體,並且寫著 Object(Kernel)#puts,表示這個 puts 方法是被定義在 Object 的(事實上是在 Kernel,透過 Mixin 混到 Object 裡的)

回傳的這個 Method 類別實體其實也可以直接呼叫,例如:

my_puts = method(:puts)
my_puts.call("Hello Ruby")

另外在寫 Rails 的時候,有時候想要知道某個好用的方法或 helper 是放在哪邊,想看看原始碼是怎麼寫的,也可以透過這個方式(Ruby 1.9 限定):

require 'active_support/all'
puts 10.day.method(:ago).source_location

# ["/Users/eddie/.rvm/gems/ruby-1.9.2-p180/gems/activesupport-3.0.9/lib/active_support/core_ext/numeric/time.rb", 63]

Method#source_location 會回傳一個陣列,裡面放著檔名以及在第幾行。

參考資料:

Ruby API – Method 類別

CoffeeScript 簡介

什麼是 CoffeeScript?

簡單的說,它就是 JavaScript 啦,只是用不同的程式語言來寫而已。

為什麼選擇 CoffeeScript?

不少 JavaScript 社群,包括 JavaScript 的老爸Brendan Eich,也對它讚譽有加,有社群及大神的背書,加上 Rails 3.1 之後會把 CoffeeScript 變成預設支援,是我選擇它的原因之一。不過對我個人來說,CoffeeScript 的語法感覺像是 PythonRuby 的混合體,從這些語言身上借了一些我個人很愛的元素,加上對我個人來說學習的負擔不算太大,這才是我選擇它最主要的原因(聽說 CoffeeScript 還有向 Haskell 取經,不過我跟它不熟)。

記住你青春無畏的樣子

記住你青春無畏的樣子

其實只是一篇沒什麼內容的口水文!

最近在整理東西的時候發現一枚我在十多年前刻的印章,這是第一次出來闖江湖用的名號。(認識我十年或以上的朋友也許還記得這個當年自以為是的名號)。

正所謂初生之犢不畏虎,年輕時候在學校幫忙寫校務系統,才剛學會用 ASP 寫點簡單的資料庫新增、修改、刪除功能,然後就自以為放眼望去沒高手了;連在 BBS 上回答別人問題,也常丟 RTFM 出來(現在好像也差不多,在 PTT Flash 版也常叫人去翻 F1 手冊),現在想想真不知道當年哪來的自信。

不過話說回來,雖然年輕氣盛,但卻很敢試新的玩具,很敢到處挑戰權威,到處筆戰,什麼沒在怕;反而現在年紀大了,不只學習能力跟記憶體有變差的趨勢,不知道是不是喝了太多年的塑化劑,連膽子也都變小顆了。

最近104 人力銀行拍了一個廣告:

廣告中的那句台詞「記住你青春無畏的樣子」,整個打到我的點。

Do..End v.s Braces

話說在 Ruby 裡,Block 可以用 do..end 的方式來寫,也可以用大括號來寫,例如用 do..end 的方式寫:

(1..5).each do |i|
  puts i   # 得到1 2 3 4 5
end

用大括號的方式寫的話:

(1..5).each { |i|
  puts i   # 一樣也是得到1 2 3 4 5
}

不過這兩天在看 The Ruby Way 的時候,看到一段是這樣寫的:

“Note that do and end may be substituted for the braces that delimit a block. There are differences, but they are fairly subtle.”
-- The Ruby Way(2nd edition), Page.22

書裡沒看到特別講到底哪邊不一樣,所以好奇的到處翻了網路上的一些資料,發現原來這兩種寫法的優先順序有一些些的不一樣,來看一段範例:

my_array = [1, 2, 3, 4, 5]

p my_array.map { |item|
  item * 2  # 得到[2, 4, 6, 8, 10]
}

p my_array.map do |item|
  item * 2  # 得到[1, 2, 3, 4, 5]
end

為什麼結果跟預期的不一樣? 原來,因為省略了一些小括號,第二段的程式碼本來的意思是:

p(my_array.map do |item| item * 2 end)  # 得到[2, 4, 6, 8, 10]

但卻因為 do..end 的優先順序比較小,原式被解析成:

p(my_array.map) do |item| item * 2 end # 得到[1, 2, 3, 4, 5]

結果後面的 do..end 還沒開始跑,my_array.map 就先被 p 給印出來了..而用大括號的寫法的優先順序比較高,則不會有這個困擾。這樣那到底什麼時候要用 do..end? 什麼時候要用大括號? 還是乾脆全部都用大括號就好?

基本上如果 Block 的執行結果是會有回傳值的,那就建議用大括號來寫,其它的大致上都可以用 do..end 來寫。

果然魔鬼都躲在細節裡!

如果寫得有錯再請不吝指正,感謝!

關於AS讀書會

關於AS讀書會

昨天是第四回的 AS 讀書會,沒想到竟然能辦到第四回,真的太感謝大家的支持,到目前為止,每回的報名人數都一直在90~110 人之間,比我想像的多很多。

沒關係,人多也有人多的玩法。

其實我沒特別跟大家說明,不過如果大家有注意到的話,每次上台分享的講者,我會刻意安排一位前輩搭配相對比較不那麼老鳥的新鳥。老鳥們通常有豐富的業界或講課的經驗,通常可以給我們帶來很完整的演出,而新鳥雖然也許講話會緊張,或可能會有些小狀況,但也常帶來一些”原來可以這樣玩”的新想法。

上台表演跟坐在底下聽,真的是完全兩個不同的世界

會這樣安排的原因是我想讓新鳥也有磨練的舞台,希望讓他們有一天也變成老鳥,然後再來提攜新的新鳥,這樣循環下去。我真心的希望可以藉由這樣的形式來達到另一種的“人人有功練”的理想,所以每次在向老鳥取經的同時,若新鳥們在表演時有些小的狀況的話,也還請各位多多包涵。

如果你也想上台分享心得,或是對某個主題/神人有興趣的,請別客氣的跟我說,狀況許可的話我再來幫忙橋時間。

我想這樣的聚會除了聽大家心得分享之外,會中、會後的時間,同好交流才是我覺得最重要的。我看到大家在休息時間大多不會只是坐在椅子上休息,而會起來找人聊天,這樣很棒!

你也想認識高手神人們嗎? 下次別害羞,名片拿上手,上前去說聲「您好,我是 XXX,久仰大名..」,別擔心碰壁,這些高手神人們都很 nice 的。

而辦這個聚會對我個人我有什麼好處? 其實我賺很大:

  • 講話似乎有比較不會抖,人也比較不會晃、也不會飄來飄去
  • 見識到老鳥們是怎麼”表演”的
  • 學到不少辦活動的眉角,例如橋人、橋時間、橋場地等..

這些經驗值都不是花錢去上課就學得到的,我真的賺到了!!

最後

  • 只要大家願意繼續支持,我們就讓這個聚會繼續辦下去。
  • 希望可以在一年內辦超過 12 場次。
  • 誠徵願意跟大家分享心得的講者。

若有任何建議或想法,請別客氣的讓我知道。

感謝大家的支持!

Learning Something New

Learning Something New

最近寫不太出技術相關的東西,那就來個比較閒聊(嘴砲)性質的主題吧!

在第三回的 AS 讀書會上,maso 兄的 talk 裡的第一張投影片寫著:

“人活得好好的,幹嘛寫 app?”

當下我也覺得,真的,人活得好好的,幹嘛找一些自己不熟的新東西來砸自己的腳?

AS2 寫得好好的,幹嘛要學什麼 AS3?
Flash 寫得好好的,幹嘛要寫什麼 iOS app?
PHP 寫得好好的,幹嘛要學什麼 Ruby/Rails?

Amazon Web Services 之門外漢心得

雲端,雲端,大家都在講雲端,不過我這種第三類組畢業的學生,沒有什麼的理論基礎,也不喜歡講理論(不過聽李教授說人死了之後就會在雲端了),僅就我自己最近試玩幾天 Amazon 的 EC2 心得與大家分享。