有非常多的文章在介紹 Ruby 時,會提到 Ruby 是一款物件化非常徹底程式語言,來看看OOP的定義:
物件導向程式設計(英語:Object-oriented programming,縮寫:OOP)是種具有物件概念的程式編程典範,同時也是一種程式開發的抽象方針。它可能包含資料、屬性、程式碼與方法。物件則指的是類別的實體。它將物件作為程式的基本單元,將程式和資料封裝其中,以提高軟體的重用性、靈活性和擴充性,物件裡的程式可以存取及經常修改物件相關連的資料。在物件導向程式編程裡,電腦程式會被設計成彼此相關的物件。
從 OOP 的來看,一個類別( class )定義了一件事物的抽象特點,其中包含了資料的形式以及對資料的操作。
物件導向是模擬現實生活中物件的一種程式抽象化概念。假設現實世界中每個物件都有他的狀態(state)以及行為(behavior),而對照到程式的物件導向中就會變成實體變數(instance variable)和方法(method)。 - 參考文章出處
1.用 class 定義方法給實體用,然後印出實體instance ,該實體便具備那些抽象特點,也就是使用哪些定義的方法:
定義「狗」,行為:「吠叫、吃與走路」,假設我有一隻哈士奇,牠會吃飯與吠叫。
class Dog
  def bark
    puts " 汪汪~ "
  end
  def eat
    puts " 好吃好吃! "
  end
end
husky = Dog.new
husky.bark     # 印出 汪汪~
husky.eat      # 印出 好吃好吃!
class Animal
end
class Dog < Animal  # 繼承 Animal
end
husky = Dog.new
簡單的說類別就像模子,本身不直接拿來使用的,用模子印出的實體化成物件( object ),才被拿來「使用」。
object.calss             # 印出 Class
Class.class              # 印出 Class
Object.superclass        # 印出 BasicObject
Class.superclass         # 印出 Module.class
BasicObject.class        # 印出 Class
BasicObject.superclass   # 印出 nil
Module.class             # 印出 Class
Module.superclass        # 印出 Object

最後來做個的小實驗,用 .instance_methods可叫出該 class 具備的 instance method,以此來驗證一下將 class 作為實體的寫法是否行得通
Dog = Class.new do
  def bark
    puts " 汪汪~ "
  end
end
class Dog
  def eat
    puts " 好吃好吃! "
  end
end
Dog.instance_methods - Object.instance_methods    # 印出 [:bark, :eat]
上例可以推測出兩種宣告 class 的方法是等效的,差別在於使用 new 方法時,必須將 block 掛上,如此才可以把 method傳進該class 裡。
此文同步刊登於CJ-Han的網站