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