Ruby 入門 [部分を共同利用-モジュール]

#複数のクラスでメソッドを共同利用する

```rb:モジュールの定義

module モジュール
end
```
モジュールはクラスと似ているが、クラスと違ってインスタンスを作ることができない。

● モジュールにメソッドを定義する

```rb
module whippedCream
    def whipped_cream
        @name += "ホイップクリーム"
    end
end
↪️＃何も表示されない
```
クラス同様、定義しただけではメソッドは実行されない

● モジュールのメソッドをクラスで使う -include

```rb:includeメソッド

class クラス名
　include モジュール名
end
```

```rb
module WhippedCream
    def whipped_cream
        @name += "ホイップクリーム" ——————#①
    end
end
```
```rb
class Drink
    include WhippedCream ————#②
    def initialize(name)
        @name = name ————#③
    end
    def name
        @name ————#④
    end
end

drink = Drink.new("モカ") ————#⑤
drink.whipped_cream ————#⑥
puts drink.name ————#⑦
↪️モカホイップクリーム
```
①で@nameの末尾に”ホイップクリーム”が足される
②モジュールWhippedCreamのメソッド、whipped_creamが利用可能になる
③⑤のDrink.newメソッドの引数に”モカ”が渡され、@nameに代入される
④戻り値として@nameに代入されているオブジェクトを返す
⑤③に”モカ”を渡す
⑥Drinkオブジェクトのwhipped_creamメソッドが呼び出される
⑦@nameを取得すると”モカホイップクリーム”になっている

● モジュールは複数のクラスで共同利用できる

```rb
module WhippedCream
    def whipped_cream
        @name += "ホイップクリーム"
    end
end

class Drink
    include WhippedCream
    def initialize(name)
        @name = name
    end
    def name
        @name
    end
end

class Cake
    include WhippedCream
    def initialize(name)
        @name = name
    end
    def name
        @name
    end
end

drink = Drink.new("モカ")
drink.whipped_cream
puts drink.name

cake = Cake.new("チョコレートケーキ")
cake.whipped_cream
puts cake.name
↪️モカホイップクリーム
 チョコレートホイップクリーム
```
モジュールは複数のクラスで使える。複数のクラスでモジュールをincludeすることで、そのモジュールを共同利用できる。

● モジュールのメソッドをクラスメソッドにする -extend

```rb:クラスにモジュールを定義する

class クラス名
　include モジュール
end
```

```rb
module Greeting ————#①extendメソッドで利用するモジュールを定義
    def welcome ————#②extendしたいメソッドをインスタンスメソッドとして定義
        "いらっしゃいませ！"
    end
end

class Cafe
    extend Greeting ————#③extendメソッドの引数にモジュールGreetingを渡す
end

puts Cafe.welcome ————#④Cafeクラスのクラスメソッドwelcomeを呼び出す
↪️いらっしゃいませ！
```
● モジュールにクラスメソッドを定義する

```rb
module Whipped_Cream
    def self.info
        "トッピング用ホイップ"
    end
end

puts Whipped_Cream.info
↪️トッピング用ホイップクリーム
```

```rb:定数を使った例
#クラスメソッドinfoを定義して呼び出している

module Whipped_Cream
    Price = 100 ———#Priceは定数なので、大文字出始める
end

puts Whipped_Cream::Price
↪️100
#Whipped_creamの中で定義されている定数Priceを使う時はWhipped_cream::Priceで繋げて書く
```
● 名前空間
クラス名(またはモジュール名)の指定

クラス名(またはモジュール名)::クラス名(またはモジュール名)

```rb
module BecoCafe
    class Coffee
        def self.info
            "深みと香りのコーヒー"
        end
    end
end

module MachuCafe
    class Coffee
        def self.info
            "豊かな甘みのコーヒー"
        end
    end
end

puts BecoCafe::Coffee.info
puts MachuCafe::Coffee.info
↪️深みと香りのコーヒー
 豊かな甘みのコーヒー
```
モジュール名::クラス名と書くことでクラスを使い分けることができる

#部分を別ファイルに分ける
● 別ファイルのクラスやモジュールを読み込む

```rb:whipped_cream.rb
module WhippedCream
    def whipped_cream
        @name += "ホイップクリーム"
    end
end
```

```rb:drink1.rb
require_relative "whipped_cream" ————#whipped_cream.rbファイルを読み込んでいる
class Drink
    include WhippedCream
    def name
        @name
    end
    def initialize
        @name = "モカ"
    end
end

mocha = Drink.new
mocha.whipped_cream
puts mocha.name
↪️モカホイップクリーム
```
● includeとrequire_relativeの違い

include ———モジュール名を渡してそのモジュールに書かれたメソッドをクラスから利用できるよう　　　　
　　　　　　　 にするメソッド
require_relative ———ファイル名を渡してそのファイルに定義されたクラスやモジュールを使えるよ
　　　　　　                  うにするメソッド
ファイルを読み込む
  require_relative　“ファイル名”