0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-09-12

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

モジュールの定義

module モジュール
end

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

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

module whippedCream
    def whipped_cream
        @name += "ホイップクリーム"
    end
end
↪️#何も表示されない

クラス同様、定義しただけではメソッドは実行されない

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

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
↪️深みと香りのコーヒー
 豊かな甘みのコーヒー

モジュール名::クラス名と書くことでクラスを使い分けることができる

部分を別ファイルに分ける

● 別ファイルのクラスやモジュールを読み込む

whipped_cream.rb
module WhippedCream
    def whipped_cream
        @name += "ホイップクリーム"
    end
end
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 “ファイル名”

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?