Ruby Mix-inでメソッドをクラスのインスタンスメソッドとして取り込む


スポンサーリンク

◆目次◆

モジュールとは

moduleは以下のように定義します。

module モジュール名

end

モジュールを取り込むにはincludeというキーワードを使います。

Rubyのモジュールには以下のような特徴があります。

  • includeできるモジュールの数に制限はない
  • モジュールはインスタンス化できない
  • 継承することはできない

それで、モジュールの用途は以下のようなものがあります。

  • 名前空間を作る
  • モジュールのメソッドを、あるクラスのインスタンスメソッドとして取り込む
  • モジュール関数を定義して使う
  • モジュールのメソッドを、あるオブジェクトのクラスメソッドとして取り込む

名前空間を作る場合は、::演算子を使います。

# encoding: utf-8
module Fukuoka
  module Hakataku
    def say_chiku
      puts "中洲あるよ!"
    end
  end

  module Tenjin
  	def say_depart
  	  puts "パルコへいこう!"
  	end
  end
end

class Ken
  include Fukuoka::Hakataku
end

ken = Ken.new

ken.say_chiku

実行結果

中洲あるよ!


extendを使ってメソッドをオブジェクトに取り込む

Personというインスタンスに、ボクサーとしての振る舞いを持たせてみます。
それっぽく言うと、あるオブジェクトに、モジュールのメソッドを特異メソッドとして取り込む、ということです。

セルが人造人間18号を吸収したみたいに、性質を吸収して使うことができます。
喰えば喰うほど強くなる蟻の王 メルエムのようなものかもしれません。

extendというキーワードを使います。

module Boxer
  def punch
  	puts "super pubch!"
  end

  def jab
  	puts "jab!jab!jab! I\'m #{name}"
  end
end

class Person
  attr_accessor :name
  
  def say_name
  	puts "my name is #{name}"
  end
end


takeshi = Person.new
takeshi.name = "takeshi"

takeshi.say_name

takeshi.extend Boxer

takeshi.punch
takeshi.jab

これ、実行すると、

my name is takeshi
super pubch!
jab!jab!jab! I'm takeshi

となって、あたかもPersonクラスがBoxerクラスのメソッドを持っているかのように使うことができます。


includeを使って、クラスのひな形にメソッドを取り込む

次は、あるクラスにインスタンスメソッドを取り込んでみましょう。
includeというキーワードを使います。

以下の例をみてもわかりますが、あたかもPersonクラスがBoxerクラスの振る舞いを持っているように扱うことができます。

module Boxer
  def punch
  	puts "super pubch!"
  end

  def jab
  	puts "jab!jab!jab! I\'m #{name}"
  end
end

class Person
  attr_accessor :name

  include Boxer
  def say_name
  	puts "my name is #{name}"
  end
end


takeshi = Person.new
takeshi.name = "takeshi"

takeshi.say_name

#takeshi.extend Boxer

takeshi.punch
takeshi.jab

実行した結果は以下のようになります。

my name is takeshi
super pubch!
jab!jab!jab! I'm takeshi


<参考文献>
パーフェクトRuby (PERFECT SERIES 6)