moduleとは
クラスによく似た機能であり、任意の式
やメソッドを定義
できます。
クラスとの大きな違いは
- インスタンスを生成できない
- 継承できない
また、用途はいくつかありますが、特異メソッドの取り込み方についてまとめていきます。
moduleに特異メソッドを定義
モジュールには特異メソッドを直接定義することができます。self
をメソッド名の前につけて定義します
module A
def self.foo
puts "hello"
end
end
A.foo # => hello
このように、moduleで定義したものは特異メソッドとなります。
classへ特異メソッドを追加する
特定のclassへmoduleから特異クラスを追加する場合、class拡張する(classのスコープに入る)
必要があります。
- 特異メソッドは特異クラスへ定義する必要がある
- 特異クラスはクラスの裏に隠れている
2つめは抽象的な表現ですが、クラスには特異クラスがセットで存在して、特異メソッドを定義するにはclass << self
という構文が必要だと大まかに理解しておきます。
module Bar
def bar
puts "hello"
end
end
class Baz
class << self
include Bar
end
end
p Baz.singleton_methods # => [:bar]
singleton_method
は特異メソッドを定義したものを調べることができます。
moduleを使用し、class << self
することで特異メソッドが定義されていることがわかります。
ちなみにこれは、インスタンスオブジェクトにも使用可能です。
module MyModule
def my_method
puts "hello"
end
end
obj = Object.new
class << obj
include MyModule
end
obj.my_method # => "hello"
obj.singleton_methods # =>[:my_method]
extendを使う
class << self
構文は、extend
を使用することで同様に書き換えることもできます。
module Bar
def bar
puts "hello"
end
end
class Baz
extend Bar
end
p Baz.singleton_methods # => [:bar]
extendを使用した時の方がコードが短くなる分描きやすそうですね!