複数のクラスでメソッドを共同利用する
module モジュール
end
モジュールはクラスと似ているが、クラスと違ってインスタンスを作ることができない。
● モジュールにメソッドを定義する
module whippedCream
def whipped_cream
@name += "ホイップクリーム"
end
end
↪️#何も表示されない
クラス同様、定義しただけではメソッドは実行されない
● モジュールのメソッドをクラスで使う -include
class クラス名
include モジュール名
end
module WhippedCream
def whipped_cream
@name += "ホイップクリーム" ——————#①
end
end
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を取得すると”モカホイップクリーム”になっている
● モジュールは複数のクラスで共同利用できる
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
class クラス名
include モジュール
end
module Greeting ————#①extendメソッドで利用するモジュールを定義
def welcome ————#②extendしたいメソッドをインスタンスメソッドとして定義
"いらっしゃいませ!"
end
end
class Cafe
extend Greeting ————#③extendメソッドの引数にモジュールGreetingを渡す
end
puts Cafe.welcome ————#④Cafeクラスのクラスメソッドwelcomeを呼び出す
↪️いらっしゃいませ!
● モジュールにクラスメソッドを定義する
module Whipped_Cream
def self.info
"トッピング用ホイップ"
end
end
puts Whipped_Cream.info
↪️トッピング用ホイップクリーム
# クラスメソッドinfoを定義して呼び出している
module Whipped_Cream
Price = 100 ———#Priceは定数なので、大文字出始める
end
puts Whipped_Cream::Price
↪️100
# Whipped_creamの中で定義されている定数Priceを使う時はWhipped_cream::Priceで繋げて書く
● 名前空間
クラス名(またはモジュール名)の指定
クラス名(またはモジュール名)::クラス名(またはモジュール名)
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
↪️深みと香りのコーヒー
豊かな甘みのコーヒー
モジュール名::クラス名と書くことでクラスを使い分けることができる
部分を別ファイルに分ける
● 別ファイルのクラスやモジュールを読み込む
module WhippedCream
def whipped_cream
@name += "ホイップクリーム"
end
end
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 “ファイル名”