---
# System prepended metadata

title: Ruby Class (類別) 和 instance (實體)

---

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