Rails三兩事 A website introduce you ruby&rails and technology news.

6Mar/090

Ruby的Metaprogramming

對一個程式新手來說,什麼是Metaprogramming? 一定非常疑惑.
而對Metaprogramming而言,Ruby是一個非常好的選擇.
但,但底什麼是Metaprogramming?
查字典,你查不到Metaprogramming. 於是將Meta和Programming分開查.
你查到了類似 "超越...之前" 和 "程式語言",但這看的懂才怪.
於是你又上wiki,英文看不懂看中文, 中文寫"元編程". 靠,這不是對岸的用詞嗎?
搞老半天你還是不懂,你想哭,想放棄了.

其實Meta programming就是在 程式碼中製造(產生)程式碼, 或說 用 code寫code.
相信大家都聽過物件導向,物件導向提倡的就是 模組化,繼承,等功能.
這些功能都只為了幾個目地 : 讓東西可以重覆使用. (個人認為還有好管理,因為將功能模組化了)
這樣一來,你便不需要一而再再而三的重覆編寫已有的功能.

但人們是懶惰的,於是讓"程式碼自動產生",連寫都不想寫的想法產生,這就是Meta programming.

以Ruby而言,簡單的範例如下 :

class Dog
  attr :leg,true
end
Tom=Dog.new
Tom.leg    #=>nil
Tom.leg=4 #=>4
Tom.leg    #=>4

讓我們先再看另一個範例

class Dog
end

%w(Won Wonwon Au Uuuu).each do |name|
  Dog.class_eval <<-HERE
    def #{name}()
      p 'Dog bark:  #{name.upcase}!'
    end
  HERE
end

Tom = Dog.new
Tom.Won
Tom.Wonwon
Tom.Au
Tom.Uuuu

第二個範例的顯示是Dog bark: WON! ....以此類推.

第一二個範例都顯示了只以簡單的幾行就建立出一些重覆性的函式.
第一個範例attr是內建的,當你attr,後面加true屬性,它會為你自動建立一個getter以及一個setter.
第二個範例則是以字串陣列的形式,將名稱傳入HERE文件,並透過eval將它實體化.

兩個範例應該很快的顯示了Ruby為何被稱為適合Metaprogramming了.

--延伸閱讀
關於Meta programming
Digging into Ruby Symbols
Seeing Metaclasses Clearly
An Exercise in Metaprogramming with Ruby - ' Metaprogramming Intro '

關於Eval
Evaluation Options in Ruby