Câu trả lời khác là tốt. Bạn muốn thêm rằng class_eval
có thể được sử dụng khi bạn muốn tham chiếu lớp không phải bởi hằng số của nó hoặc để vá đối tượng cụ thể.
ví dụ:
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
Bạn có thể sử dụng class_eval
để vá đối tượng cụ thể mà không ảnh hưởng đến toàn bộ lớp gốc.
obj = "asd"
obj.singleton_class.class_eval <<-eof
def asd
puts "gah"
end
undef_method :some_method
Trên đây là giống như:
class << obj
...
end
instance_eval
sẽ có hành vi hơi khác nhau bởi một số cách sử dụng.
Tôi tìm thấy câu hỏi này và câu trả lời thú vị: How to monkey patch a ruby class inside a method
Cũng có những câu hỏi về instance_eval
vs class_eval
nhưng tôi không có một liên kết có ích.