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
の違いは名前だけなのでケースによってよしなに使い分けましょう。