---
# System prepended metadata

title: Ruby Module

---

# Ruby Module

## 模組建立方式

跟類別一樣，命名必須是常數
```ruby=
module ModuleName
    # ...
end
```

用include(引入)或extend(擴充)的方式引入模組

include範例:

```ruby=
module Flyable
    def fly
        puts "i can fly"
    end
end

class Cat
    include Flyable #include引入Flyable模組，作用在實體方法
end

kitty = Cat.new
kitty.fly # "i can fly" 實體方法
```

extend範例:
```ruby=
module Flyable
    def fly
        puts "i can fly"
    end
end

class Cat
    extend Flyable #extend 擴充 Flyable模組，增加類別方法
end

Cat.fly #類別方法
```

## 模組跟類別的差別
類別有繼承功能，但模組沒有

所以不能長這樣
```ruby=
module Flyable < SomeModule
end
```
模組不能實體化，所以也不能長這樣
```ruby=
module Flyable
end

wing = Flyable.new
```

## 同名類別 namespace

```ruby=

module A
  class Cat #在模組A中的Cat類別 
  end
end


module B
 class Cat  #在模組B中的Cat類別
 end
end

kitty = A::Cat.new #連名帶姓的呼叫
nancy = B::Cat.new
```