Altre risposte sono buone. Si desidera aggiungere che class_eval
può essere utilizzato quando si desidera che la classe di riferimento non sia costante o che rappresenti un oggetto particolare.
ad es.
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
È possibile utilizzare class_eval
di patch particolare oggetto senza affectin classe radice intera.
obj = "asd"
obj.singleton_class.class_eval <<-eof
def asd
puts "gah"
end
undef_method :some_method
Quanto sopra è uguale a:
class << obj
...
end
instance_eval
avrà un comportamento leggermente differente da qualche uso.
Trovo questa domanda e risposte interessanti: How to monkey patch a ruby class inside a method
Inoltre c'erano domande su instance_eval
vs class_eval
ma io non avere un link a portata di mano.