Otras respuestas son buenas. Desea agregar que class_eval
se puede usar cuando se quiere una clase de referencia no por su constante o para parchar un objeto particular.
p. Ej.
huh = String
class huh
end
SyntaxError: (eval):2: class/module name must be CONSTANT
huh.class_eval <<-eof
def mamma
puts :papa
end
eof
"asdff".mamma
=> papa
Puede utilizar class_eval
parchear objeto particular sin affectin clase raíz entera.
obj = "asd"
obj.singleton_class.class_eval <<-eof
def asd
puts "gah"
end
undef_method :some_method
Lo anterior es la misma como:
class << obj
...
end
instance_eval
tendrá un comportamiento ligeramente diferente por cierto uso.
Me parece preguntas y respuestas interesantes: How to monkey patch a ruby class inside a method
también hubo preguntas sobre instance_eval
vs class_eval
pero no tienen un enlace a mano.