Muchos desarolladores no entienden muy bien la diferencia entre el metodo eval() y module_eval().
Bueno voy a explicarlo de forma sencilla traduciendo un mail de Matz a la lista de ruby-dev:
eval() evalúa un string sobre el contexto actual.
module_eval() evalúa un string/block sobre el conexto del modulo. Si se evalúa la sentencia ‘def’ con eval(), un método va a ser definido en módulo actual. Un método será definido para una clase o módulo mediante module_eval().