Inne odpowiedzi są dobre. Chcesz dodać, że class_eval
może być użyty, gdy chcesz, aby klasa odniesienia nie była stała lub łatała dany obiekt.
np.
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
Można użyć class_eval
załatać konkretny obiekt bez affectin całej klasy root.
obj = "asd"
obj.singleton_class.class_eval <<-eof
def asd
puts "gah"
end
undef_method :some_method
Powyższe jak poniżej:
class << obj
...
end
instance_eval
będą miały nieco odmienne zachowanie od pewnego stosowania.
uważam to pytanie za interesujący: How to monkey patch a ruby class inside a method
Również tam były pytania o instance_eval
vs class_eval
ale nie mam link pod ręką.