# Ruby Class (類別) 和 instance (實體) ## 定義類別 類別命名規定必須是常數,而常數名稱第一個字必須要大寫 ```ruby= class Cat def eat(food) puts '#{food} 好好吃!!' end end ``` 使用類別來產生實體method ```ruby= class Cat def eat(food) puts '#{food} 好好吃!!' end end kitty = Cat.new #Cat是類別,kitty是實體 kitty.eat "魚" # 印出 魚 好好吃!! ``` 練習: 建立一個Dog類別跟Cat類別,讓他們繼承Animal,會走路跟吃飯 ```ruby= class Animal def walk puts "I am walking" end def eat puts "I am eating" end end class Dog < Animal end class Cat < Animal end kitty = Cat.new kitty.walk # I am walking kitty.eat # I am eating puppy = Dog.new puppy.walk # I am walking puppy.eat # I am eating ``` ## 物件初始化 initialize initialize 是一個特別的方法,當被物件被創造時,會做的第一件事情 ```ruby= class Cat def initialize puts "hello 你好" end end kitty = Cat.new #出生就會打招呼 ``` 也可以帶變數進去 ```ruby= class Cat def initialize(name ,age) @name = name #指定實體變數 @age = age puts 'hello , 你好' end end kitty = Cat.new("kk", 18) ``` :::info new vs initialize new是真的做出東西,initialize是初始化後的第一個動作,傳給new方法的引數,後續會由initialize方法收下。若沒有給引數的話,會發生引數個數錯誤的錯誤訊息。 ::: ## 實體方法(instance method)與類別方法(class method) 實體方法是作用在實體 ```ruby= class Cat def eat(food) # 實體方法 puts '#{food} 好好吃!!' end end kitty = Cat.new #kitty是實體 kitty.eat "魚" ``` 這邊來演示類別方法,在定義方法名稱前面加上self ```ruby= class Cat def self.eat # 類別方法 puts '好好吃!!' end end Cat.eat ```