パーフェクトRuby写経 特異メソッドの作り方
特異メソッドとは、クラスに定義されたメソッドの他に、そのオブジェクト固有のメソッド持つことができ、それを特異メソッドといいます。
特異メソッドを定義するには、メソッドを定義したいオブジェクトをメソッド名の前に指定してメソッドを記述します。 また、特異メソッドの中でsuperを呼び出すと、クラスに定義されている同名のメソッドが呼び出されます。
class Foo def override_me p 'in Foo class' end end foo = Foo.new bar = Foo.new def bar.singleton_method p 'Called!' end def bar.override_me p 'in Foo class' end bar.singleton_method bar.override_me
モジュールに定義されたメソッドを、オブジェクトの特異メソッドとして取り込む。 そのさいには、extendを用います。
module Sweet def self.lot %w(brownie apple-pie bavarois pudding).sample end def greet_to(name) p "Hello, #{name}. My name is #{self.class}" end end o = Object.new o.extend Sweet o.greet_to 'world' #o.lot p Sweet.lot
また、self.lotのようにモジュールのメソッド名の前にselfをつけて定義すると、モジュールの特異メソッドとなります。
また、モジュール関数は「privateなインスタンスメソッドであると同時に、モジュールの特異メソッドでもある」メソッドとの事なので、これも特異メソッドの一種のようです。
module MyFunctions def my_module_func p 'Called!' end module_function :my_module_func end
一つのメソッドの場合は上記のように記述し、複数のメソッドを定義さする場合には下記のように記述するようです。
module MyFunctions module_function def my_first_func p 'first!' end def my_second_func p 'second!' end end