9-1 モジュールのメソッドをクラスで使う「include」

1.「モジュール」(module)はインスタンスメソッドを生成することができ、そのメソッドを共有することができる

2. classの中に「module モジュール名」と書くことでそのモジュールに定義されている内容を利用することができる

module WhippedCream#-----「WhippedCream」モジュールを定義--------
  def whipped_cream#-----「@nameにホイップクリームという文字を加えてくださいね」というメソッドを定義
    @name += "ホイップクリーム"
  end
end

class Drink
include WhippedCream#----Drinkクラスのオブジェクトは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#----Drinkクラスには定義されていない「whipped_creamメソッド」を使うことができる---------
puts drink.name

cake = Cake.new("チョコレートケーキ")
cake.whipped_cream
puts cake.name

#=>モカホイップクリーム
#=>チョコレートケーキホイップクリーム

3. モジュールはインスタンスメソッドだけを共有するだけでなく、「クラスメソッド」についても「extend モジュール名」と書くことで共有することができる

module Greeting#-----「Greeting」モジュールを定義-----------
  def welcome
    "いらっしゃいませ"
  end
end
class Shop
  extend Greeting#-------「Greeting」モジュールをShopクラスメソッドとした--------
end

puts Shop.welcome
#=> いらっしゃいませ

9-2 モジュールのメソッドや定数をそのまま使う

1. moduleにおいてもクラスメソッドを呼び出したいときは、同じ形式を用いる

2. moduleで定義された定数を使う際は、「::」で繋げる

3. 自分で定義する他に、Ruby自体に定義されているMathモジュールというものもある

module WhippedCream
  def self.info
    "トッピング用ホイップクリーム"
  end
end

puts WhippedCream.info
#=>トッピング用ホイップクリーム

module WhippedCream
  Price = 100#------定数を定義するときは大文字で始まる---------
end
puts WhippedCream::Price

puts Math::PI#---円周率----
puts Math.cos(Math::PI)#Mathモジュール内で定数PIを使いたいときも、自分で定義したとき同様、「::」で繋げる

4. 同じクラスだが、別々に呼び出したいとき、モジュール名を使って分けて呼び出すことを「名前空間」を作ると言う

module KomedaCafe
  class Coffee
    def self.info
      "コスパ"
    end
  end
end

module SutabaCafe
  class Coffee
    def self.info
      "オシャレ"
    end
  end
end

puts KomedaCafe::Coffee.info#------モジュール名とクラス名を繋げるときは「::」を使う------
puts SutabaCafe::Coffee.info#------モジュール名とクラス名を繋げるときは「::」を使う------
#=>コスパ
#=>オシャレ

9-3 部品を別ファイルに分ける

1. 同じフォルダーに2つのファイルが有り、片方で定義している内容を、もう片方でも引き継ぎたい場合、引き継ぐ方のファイルに「repuire_relative ”ファイル名(.rbは除く)”」と書くことで利用することができる。つまりこれは別ファイルの定義を利用することのできる方法である

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