Rubyのモジュールによるミックスインの3つの方法


こんにちは。Tomoyuki(@tomoyuki65)です。

Rubyのモジュールはミックスインで使用しますよね。

ミックスインの方法としては3つ覚えておくと良いでしょう。

この記事では、ミックスインについて解説します。

 



ミックスインの3つの方法とは?

Rubyのモジュールのミックスインでは、以下の3つの方法があります。

  •  includeでミックスイン
  •  extendでミックスイン
  •  prependでミックスイン

 

includeでミックスイン

モジュールをインスタンスメソッドとしてミックスインしたい場合は、includeを使います。

例として、以下のプログラムを実行してみて下さい。

# モジュールを定義
module Say_en
def hello_en
puts "Hello"
end
end
# クラスを定義
class Say
# モジュールをミックスイン
include Say_en
def hello_jp
puts "こんにちは"
end
end
greeting = Say.new
# インスタンスメソッドを実行
greeting.hello_jp
greeting.hello_en

 

実行結果
こんにちは
Hello

 

extendでミックスイン

モジュールをクラスメソッドとしてミックスインしたい場合は、extendを使います。

例として、以下のプログラムを実行してみて下さい。

# モジュールを定義
module Say_en
def hello_en
puts "Hello"
end
end
# クラスを定義
class Say
# モジュールをミックスイン
extend Say_en
def hello_jp
puts "こんにちは"
end
end
# クラスメソッドを実行
Say.hello_en

 

実行結果
Hello

 



prepend

モジュールをインスタンスメソッドとしてミックスインする場合は、includeを使うのが一般的ですが、Ruby 2.0からはprependでミックスインすることもできます。

prependでミックスインした場合は、同名のメソッドがあった場合にミックスインしたクラスよりも先にモジュールのメソッドが呼ばれるため、既存メソッドの置き換えることができます。

例として、以下のプログラムを実行してみて下さい。

# モジュールを定義
module Say_en
def hello_en
puts "Hello"
end
def hello_jp
puts "Hello"
end
end
# クラスを定義
class Say
# モジュールをミックスイン
prepend Say_en
def hello_jp
puts "こんにちは"
end
end
greeting = Say.new
# インスタンスメソッドを実行
greeting.hello_jp
greeting.hello_en

 

実行結果
Hello
Hello

 

実行結果の通り、prependを使用することで既存メソッドの置き換えを簡単にすることができます。

例えばモンキーパッチ(自分が期待する挙動に変更すること)をあてる際に、以前は既存のメソッドを上書きにはエイリアスメソッド使用していましたが、prependを使用することで簡単にできるようになりました。

尚、includeした場合はクラス側のメソッドの置き換えはできませんが、クラス側でモジュールのメソッドを置き換える(上書きする)ことはできます。

 

まとめ

  •  インスタンスメソッドとしてミックスインする場合は、includeを使う(クラス側でモジュールのメソッドを上書き可能)
  •  クラスメソッドとしてミックスインする場合は、extendを使う
  •  includeの代わりにprependでミックスインすると、既存メソッドの置き換えが簡単にできる

 

  • 関連記事

オススメのRuby入門サイトはどれ?Rubyの学習方法をまとめる

2017.10.24

 

The following two tabs change content below.
Tomoyuki

Tomoyuki

元SEでリスクを取って勢いで会社を辞め、人生をコンテンツにしてみたプロブロガー1年目です。私にしか書けない記事で、様々な価値を提供します!









人生をコンテンツにしたブログ

ブロガー人生の結果を、このブログで示します。



ビットコインを買うならZaif取引所がおすすめ!

Zaif取引所は他の主要取引所と比べて手数料が安いのが特徴。
ビットコインの他、イーサリアム、モナーコイン、ネムも購入可能です。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です