Ruby Metaprogramming 筆記(1):Ruby 類別的真相

李威辰
2 min readJul 2, 2018

--

最近在讀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

從上面的程式碼可以看出MyClassClass類別的實例。那Class類別是誰的實例呢?

Class.class # Class

也是Class!創建Class實例的就是Class類別本身!看一下Class這個類別的實例方法,可以發現很熟悉的身影:

Class.instance_methods(false) # [:new, :allocate, :superclass]

我們常常使用的newsuperclass方法都是定義在Class裡面,這些方法是作為實例方法(instance methods)定義在Class類別裡,因此會變成Class實例的類別方法,所以才能夠用MyClass.new的語法來創建新的MyClass實例。

總結

  1. 要弄清楚類別(class)與父類別(superclass)之間的關係。用本篇文章的例子來說,MyClass的類別是Class,父類別是Object
  2. 類別會繼承父類別的類方法與實例方法,而實例(instance)會得到類別所定義的實例方法(在類別實例裡面會變成類方法,看看new方法的說明)。
  3. 任何類別都是Class類別的實例。

--

--