Другие ответы хороши. Хочу добавить, что class_eval
можно использовать, когда вы хотите, чтобы ссылочный класс не являлся его константой или исправлял определенный объект.
, например
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
Вы можете использовать class_eval
для исправления определенного объекта, не затрагивая весь корневой класс.
obj = "asd"
obj.singleton_class.class_eval <<-eof
def asd
puts "gah"
end
undef_method :some_method
Вышеуказанное совпадает с:
class << obj
...
end
instance_eval
будет иметь немного другое поведение при некотором использовании.
Я нахожу этот вопрос и ответы интересными:
Как обезьяна пропатчить класс ruby внутри метода
Также были вопросы по поводу instance_eval
против class_eval
, но у меня нет удобной ссылки.