Source From Here
Preface
先前一直談到,Object 是 Ruby 中所有物件的父類別,如果定義類別時沒有指定父類別,那預設就是繼承 Object,然而從 Ruby 1.9 之後,Object 更上層還有一個 BasicObject類別:
BasicObject
Object 實際上繼承了 BasicObject,並含括了 Kernel 模組,可以使用 ancestors 方法得知類別的父類別與含括的模組。例如:
BasicObject 上定義了少量的實例方法:
instance_methods 可以取得 public、protected 的實例方法清單,如果傳入 false,則可取得該類別階層定義的實例方法。以下可以看出,Object 繼承 BasicObject 後,實際上並沒有定義實例方法:
Object 含括了 Kernel 模組,每個實例預設的實例方法,實際上都是 BasicObject 與 Kernel 模組提供:
BasicObject 幾乎什麼功能都沒有,這代表了你要教它什麼都可以,具體而言,你可以繼承 BasicObject,定義出自己的繼承體系,而不用擔心太多方法名稱衝突問題。例如,你也許會想要有以下的程式碼產生 XML:
產生出以下的XML:
Preface
先前一直談到,Object 是 Ruby 中所有物件的父類別,如果定義類別時沒有指定父類別,那預設就是繼承 Object,然而從 Ruby 1.9 之後,Object 更上層還有一個 BasicObject類別:
BasicObject
Object 實際上繼承了 BasicObject,並含括了 Kernel 模組,可以使用 ancestors 方法得知類別的父類別與含括的模組。例如:
BasicObject 上定義了少量的實例方法:
instance_methods 可以取得 public、protected 的實例方法清單,如果傳入 false,則可取得該類別階層定義的實例方法。以下可以看出,Object 繼承 BasicObject 後,實際上並沒有定義實例方法:
Object 含括了 Kernel 模組,每個實例預設的實例方法,實際上都是 BasicObject 與 Kernel 模組提供:
BasicObject 幾乎什麼功能都沒有,這代表了你要教它什麼都可以,具體而言,你可以繼承 BasicObject,定義出自己的繼承體系,而不用擔心太多方法名稱衝突問題。例如,你也許會想要有以下的程式碼產生 XML:
- xml = Xml.new
- xml.person do
- xml.name("caterpillar")
- xml.phone("0970933933")
- xml.mail("caterpillar@openhome.cc")
- xml.address do
- xml.office("台北市....")
- xml.home("高雄市....")
- end
- end
- puts xml.list
-
caterpillar -
0970933933
- Xml.rb
- class Xml < BasicObject
- attr_reader :list
- def initialize
- @list = ""
- @level = 0
- end
- def indent
- @list << " " * @level
- end
- def method_missing(mth, *args, &block)
- indent
- @list << "<#{mth}>"
- @list << "#{args[0]}" if args[0]
- @list << "\n" if block
- @level += 2
- yield if block
- @level -= 2
- @list << " " * @level if block
- @list << "</#{mth}>\n"
- end
- end
- xml = Xml.new
- xml.hash do
- xml.public_send("orz")
- xml.freeze("XD")
- xml.inspect("zzz")
- end
- puts xml.list
-
orz -
XD -
zzz
沒有留言:
張貼留言