最近在讀Ruby Metaprogramming這本書,裡面很多觀念顛覆了很多我對Ruby這個程式語言的認識,之後會有一系列筆記來整理一些我認為比較重要的觀念!
類別小複習
Ruby是一個物件導向的語言,我們常常用類似下列的程式碼來創建實例。
class MyClass; endobj = MyClass.new
obj.class # MyClass
用class
方法查看obj
實例的類別時,我們會得到自己定義的類別:MyClass
。平常查看繼承關係的時候,會使用superclass
這個方法來查看某類別的父類別。
class MyClass; end
MyClass.superclass # Object
如果沒有特別指定要繼承的類別的話,預設會繼承自Object
類別。到目前為止,都是基本的Ruby物件導向知識,有趣的地方在於MyClass
除了是個類別之外,也是個實例!
類別也是實例
class MyClass; end
MyClass.class # Class
從上面的程式碼可以看出MyClass
是Class
類別的實例。那Class
類別是誰的實例呢?
Class.class # Class
也是Class
!創建Class
實例的就是Class
類別本身!看一下Class
這個類別的實例方法,可以發現很熟悉的身影:
Class.instance_methods(false) # [:new, :allocate, :superclass]
我們常常使用的new
、superclass
方法都是定義在Class
裡面,這些方法是作為實例方法(instance methods)定義在Class
類別裡,因此會變成Class
實例的類別方法,所以才能夠用MyClass.new
的語法來創建新的MyClass
實例。
總結
- 要弄清楚類別(class)與父類別(superclass)之間的關係。用本篇文章的例子來說,
MyClass
的類別是Class
,父類別是Object
。 - 類別會繼承父類別的類方法與實例方法,而實例(instance)會得到類別所定義的實例方法(在類別實例裡面會變成類方法,看看
new
方法的說明)。 - 任何類別都是
Class
類別的實例。