PHPerがRuby on Railsを書くことになったので、備忘録として
PHPをやってきて、モジュールという概念を知らなかったので
モジュールの書き方
module モジュール名
処理
end
モジュール名は必ず英数字の大文字で始める
モジュールとクラスの違い
・モジュールはインスタンスを作れない
・モジュールは継承できない
モジュールを使う目的
・名前空間の提供
・インスタンスメソッドとして取り込む(Mix-in)
・モジュールをオブジェクトに取り込む(extend)
・モジュール関数
モジュールを使った名前空間の提供
Ruby on Railsのコードを見ていて、この使い方が一番多いのかなという印象
PHPでいうところの名前空間(namespace)と同じ使われ方
呼び出しは ::演算子を使い、モジュール名::モジュール名 またはモジュール名::クラス名 のように使う
インスタンスメソッドとして取り込む(Mix-in)
PHPでいうところのtrait?
Rubyは多重継承を許さず、Mix-inという仕組みを用意している
Mix-inを使ってincludeされたモジュールのメソッドは、クラスのインスタンスメソッドになる。
module PerfectHuman
def walk
puts "歩く"
end
end
module SwimmingHuman
def swim
puts "泳ぐ"
end
end
class Human
include PerfectHuman, SwimmingHuman
end
obj = Human.new
obj.walk
#=> 歩く
obj.swim
#=> 泳ぐ
モジュールをオブジェクトに取り込む(extend)
モジュールに定義されたメソッドは、オブジェクトのインスタンスに、特異なメソッドとして取り込むこともできる
module Move
def walk
puts "歩く"
end
end
obj = Object.new
obj.extend Move
obj.puts
クラス定義内でもextendは使用でき、取り込まれたモジュールのメソッドはクラスメソッドになる
module Move
def walk
puts "歩く"
end
end
class Human
extend Move
end
Human.walk
モジュール関数
Rubyの組み込みモジュールとして定義されているもの。
module_function :メソッド名 と記述される