読者です 読者をやめる 読者になる 読者になる

パーフェクト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