Ruby の #class_eval と #module_eval の違い

Ruby#class_eval はクラスオブジェクト専用、#module_eval はモジュールオブジェクト専用のメソッドだと思っていたのですが、実は名前が違うだけで同等のメソッドだったみたい。

検証コード

class C
end

C.class_eval {
    def homu
    end
}

# クラスオブジェクトに対しても #module_eval が使える
C.module_eval {
    def mami
    end
}

p C.instance_methods false
# => [:homu, :mami]


module M
end

# モジュールオブジェクトに対しても #class_eval が使える
M.class_eval {
    def homu
    end
}

M.module_eval {
    def mami
    end
}

p M.instance_methods false
# => [:homu, :mami]

結論

#class_eval#module_eval の違いは名前だけなのでケースによってよしなに使い分けましょう。

参照