# 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
```