Ruby 在傳送 block 跟方法時,可以呼叫 define_method
class MyClass
["foo", "bar"].each do |method|
define_method(method) {
puts "Obj #{method}"
}
end
end
myobj = MyClass.new
myobj.foo
myobj.bar
在這個 class 底下,有 "foo" 、 "bar" 讓 class 做出來的實體使用.做取用
在 Ruby 中,你可以依照需求替 class 加方法
即使 class 已經被定義,你一樣可以使用 define_method 去增加及重新定義方法
Open Class
Ruby 的語言特色之一,可針對現有的 class 增加方法,甚至可以改寫原有的方法
當你呼叫一個物件裡面沒有定義的方法, method_missing 會被呼叫,用來處理不存在的物件或者方法
假如你覆寫了 method_missing
你可以增加一層判斷,決定返回的值
如果沒有特別判斷,它就會找存在且相近物件的父層 method_missing 方法
但都沒有呢?就會回傳原本的錯誤訊息(NoMethodError)
但 method_missing 的效率不太高
所以當 method_missing 被呼叫時, ActiveRecord 會重新定義存取或 finder
第一次呼叫會比較慢,但後面就會快很多
欄位的值會從 hash 返回, hash 一般會從 SQLite 拿到值
假設今天要印出一個整數
你會得到一個固定長度的整數
這是 SQLite 的預設設定
但如果今天想做的是將數字轉成布林值 或者 hash轉換成 JSON
SQLite 沒辦法幫你達成,我們得需要另外寫方法