RubyのModuleについてかく。
クラスや他のモジュールに共通のメソッドや定数を提供するための仕組み。
# モジュール定義
module Hi
def say_hi
puts "Hi!"
end
end
Moduleはクラスと異なり、インスタンス化できない。また継承もできない。
モジュールにはクラスメソッドやインスタンスメソッドを定義することができる。
クラスメソッドはモジュールのinclude先で呼び出すことができない。
module Greet
# モジュールのクラスメソッド
def self.hi
puts "Hi!"
end
# モジュールのインスタンスメソッド
def bye
puts "Bye!"
end
end
Greet.hi
class Speaker
include Greet
end
speaker = Speaker.new
speaker.bye # => Bye!
speaker.hi # => NoMethodError
名前空間を用意するために使うことができる。
module University
class Student
def self.say
puts "I am a student"
end
end
end
class Student
def self.say
puts "私は学生です"
end
end
Student.say # => 私は学生です
University::Student.say # => I am a student
継承を用いずクラスにインスタンスメソッドを追加・上書きすることができる。
クラスは多重継承ができないが、ModuleのMixinにより多重継承を実現できる。
class Greet
include Hi
end
puts Greet.new.say_hi # => Hi!
ちなみにMixinとTraitは似ているが、Mixinは継承を用いているのに対して、Traitは継承以外の様々方法によってもメソッドを合成することができるものであり、ややニュアンスが異なる。
cf. ja.wikipedia.org - Mixin cf. ja.wikipedia.org - トレイト
extendを使うことで、クラスに特異メソッドを追加することができる。
module Hi
def hi
puts "Hi!"
end
end
class Greet; end
Greet.new.extend(Hi).hi # => Hi!
関連書籍