Ruby Object Model 是 Ruby 程式語言中用來描述物件、類別和模組之間關係的模型。 Ruby 的物件模型是其核心概念之一,它有助於理解 Ruby 中物件的創建、繼承、方法查找等關鍵概念。
我們已知在 ruby 裡萬物皆物件(object)
,物件是類別( class)的實體化,但object
上方怎麼還有Kernal
和BasicObject
?現在就讓我們一層一層來拆解它吧!
假設今天有個簡易的物件繼承鏈:建立一個puppy 實體
,屬於Dog 類別
,繼承Animal類別
,外掛 Climbable模組
。
Object 類別是 Ruby 中所有類別的根類,也就是說,每個類別都是 Object 類別的子類別。因此,Object 類別自己定義了許多在 Ruby 中常見的方法,如to_s
、inspect
、eql?
等。
所有物件都會繼承這些方法,因為它們都是 Object 的實例。當我們建立一個自訂的類別時,它會自動成為 Object 的子類別。
Kernel 是一個模組,它包含了一些常用的方法,這些方法可以直接被所有物件調用,因為所有物件都包含了 Kernel 模組。
這些方法包括我們常常用到的 puts
、print
、gets
、raise
等等。實際上,Ruby 中的許多核心方法都是 Kernel 模組的一部分。
BasicObject 類別位於 Ruby 類別層次結構的最底層,它是所有其他類別的祖先。 BasicObject 定義了非常有限的方法,只包含最基本的方法,如 __send__
和 __id__
。這使得 BasicObject 可以用作創建非常簡單的、沒有任何額外功能的物件的基礎。通常,BasicObject 不會直接使用,而是用來建立一些高度客製化的基本物件。
Class 是 Ruby 中用來建立物件類別的關鍵元素。每個類別本身也是一個Object,是 Class 類別的實例。
Ruby 中的大多數物件都是某個類別的實例,這些類別都是 Class 的子類別(包括 Class 本身)。透過定義類別,你可以建立新的物件類型,定義該類型的屬性和方法。類別可以繼承其他類,從而取得其屬性和方法,並可以被其他類別繼承。
現在再來回頭看類別,也就更清楚他在ruby中扮演的角色以及如何使用,心裡有種莫名的踏實感哈哈哈。
Module 是一種封裝和命名空間機制,用於組織程式碼並將相關方法和常數組織在一起。模組不能實例化,本身也沒有繼承的功能,它主要被用來include
, exclude
到類別中,以共享方法和常數。模組中的方法可以被多個類別共享,這有助於減少程式碼的重複性。
參考資料: