ブログ記事からの転載です
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
の違いは名前だけなのでケースによってよしなに使い分けましょう。