こんにちは。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
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
実行結果の通り、prependを使用することで既存メソッドの置き換えを簡単にすることができます。
例えばモンキーパッチ(自分が期待する挙動に変更すること)をあてる際に、以前は既存のメソッドを上書きにはエイリアスメソッド使用していましたが、prependを使用することで簡単にできるようになりました。
尚、includeした場合はクラス側のメソッドの置き換えはできませんが、クラス側でモジュールのメソッドを置き換える(上書きする)ことはできます。
まとめ
- インスタンスメソッドとしてミックスインする場合は、includeを使う(クラス側でモジュールのメソッドを上書き可能)
- クラスメソッドとしてミックスインする場合は、extendを使う
- includeの代わりにprependでミックスインすると、既存メソッドの置き換えが簡単にできる
- 関連記事
Tomoyuki
最新記事 by Tomoyuki (全て見る)
- 【スト6】モダンキャミィの初心者向けコンボまとめ【STREET FIGHTER 6(ストリートファイター6)】 - 2024年11月10日
- モンハンワイルズでおすすめのオプション設定まとめ【Monster Hunter Wilds】 - 2024年11月4日
- モンハンワイルズでおすすめのグラフィック設定まとめ【Monster Hunter Wilds】 - 2024年11月2日
コメントを残す