includeとprependの違い

Module#ancestors

というメソッドを使ってみる

このメソッドはクラス、モジュールのスーパークラスとインクルードしているモジュール を優先順位順に配列に格納して返すメソッド

https://docs.ruby-lang.org/ja/latest/method/Module/i/ancestors.html

使い方としてはこんな感じ

p Integer.ancestors
# => [Integer, Numeric, Comparable, Object, Kernel, BasicObject]

になる

https://qiita.com/pink_bangbi/items/2c2f17516cd3a7b4eeac

 

Ex1

ファイル名:practice_main.rb

require './practice'
require './practice2'

Practice2.lala

p2 = Practice2.new
p2.mama
p2.papa
p Practice2.ancestors

ファイル名:practice.rb

class Haha
  class << self
    def lala
      puts "クラスタンスメソッド"
    end
  end
end

ファイル名:practice2.rb

require "./fur"
require "./claw"

class Practice2 < Haha 
include Fur
  include Claw

  def papa
    puts "Practice2クラスのhaha"
  end
end

ファイル名:fur.rb

module Fur
  def papa
    puts "fur_moduleのなかのpapaメソッド"
  end
end

ファイル名:claw.rb

module Claw
  def mama
    puts "practice.rbののpapaメソッドを置き換えた"
  end
end

 

 

Ex2

require './practice'
require './practice2'

Practice2.lala

p2 = Practice2.new
p2.mama
p2.papa
p Practice2.ancestors

ファイル名:practice.rb

class Haha
  class << self
    def lala
      puts "クラスタンスメソッド"
    end
  end
end

ファイル名:practice2.rb

require "./fur"
require "./claw"

class Practice2 < Haha
  prepend Fur
  prepend Claw

  def papa
    puts "Practice2クラスのhaha"
  end
end

ファイル名:fur.rb

module Fur
  def papa
    puts "fur_moduleのなかのpapaメソッド"
  end
end

ファイル名:claw.rb

module Claw
  def mama
    puts "practice.rbののpapaメソッドを置き換えた"
  end
end

こう2つのコードを書いた

 

Ex1の方は

$ ruby practice_main.rb

クラスタンスメソッド

practice.rbののpapaメソッドを置き換えた

Practice2クラスのhaha

[Practice2, Claw, Fur, Haha, Object, Kernel, BasicObject]

 

と出力された

 

Ex2の方は

$ ruby practice_main.rb

クラスタンスメソッド

practice.rbののpapaメソッドを置き換えた

fur_moduleのなかのpapaメソッド

[Claw, Fur, Practice2, Haha, Object, Kernel, BasicObject]

 

と出力された

 

見ての通り上書きの順番が異なっているため、実行結果に変化が生じた