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

Ruby でインスタンスメソッドを定義する手段

特定のクラスオブジェクトに対してインスタンスメソッドを定義したい場合にどういう手段があるのかまとめてみた。

クラス定義から定義する

多分普通のやり方。
単純にクラス定義時にメソッドを定義します。

class String
    def twice
        self + self
    end
end

"homu".twice
# => "homuhomu"

define_method を使う

もう1つは define_method を使うやり方。
define_method は動的にメソッドを定義する場合に使うことが多いのかなー。

def def_twice
    # String クラスに対して #define_method を利用してメソッドを定義する
    # この時に #define_method は private メソッドなので、#send を経由して呼び出すことに注意
    String.send :define_method, :twice do
        self + self
    end
end

# この時にメソッドが定義される
def_twice

"homu".twice
# => "homuhomu"

この時に注意するのは #define_method メソッドprivate なので #send メソッドを経由して呼び出す必要がある。
さて、他にインスタンスメソッドを定義する手段ってあるかな?