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