Chỉ cần xác định một phương pháp trên đối tượng:
class Thing
def greeting
'yo, man'
end
end
Thing.instance_methods(false)
#=> [:greeting]
object = Thing.new
#=> #<Thing:0x007fc4ba276c90>
object.greeting
#=> "yo, man"
Xác định hai phương thức trên object
(đây sẽ là các phương thức thể hiện trong lớp đơn của object
.
def object.greeting
'hey, dude'
end
def object.farewell
'see ya'
end
object.methods(false)
#=> [:greeting, :farewell]
object.singleton_class.instance_methods(false) #=> [:greeting, :farewell]
object.greeting
#=> "hey, dude"
object.farewell
#=> "see ya"
new_obj = Thing.new
new_obj.greeting
#=> "yo, man"
new_obj.farewell
#NoMethodError: undefined method `farewell' for #<Thing:0x007fe5a406f590>
Xóa phương thức singleton 'greeting
.
object.singleton_class.send(:remove_method, :greeting)
object.methods(false)
#=> [:farewell]
object.greeting
#=> "yo, man"
Một cách khác để xóa :greeting
từ lớp đơn của object
như sau.
class << object
remove_method(:greeting)
end
Nguồn
2015-06-04 20:55:45
Tôi sắp sửa sử dụng thuật ngữ "vá khỉ" - nghĩ rằng nó chỉ áp dụng cho sửa đổi các phương pháp tích hợp sẵn của Ruby - nhưng sau khi googling nó xuất hiện không có sự đồng thuận về ý nghĩa của nó. Xem, ví dụ, [câu hỏi SO này] (http://stackoverflow.com/questions/394144/what-does-monkey-patching-exactly-mean-in-ruby). –
@CarySwoveland Trong lịch sử "vá tiền" đề cập đến dậm các phương pháp hiện có với việc triển khai của riêng bạn, nơi chúng chiếm toàn bộ. Trong trường hợp này, nó hoạt động nhiều hơn "mô hình", nơi nó chỉ thay đổi một đối tượng duy nhất, và các đối tượng khác, cả hiện tại và những đối tượng được tạo ra trong tương lai, đều không bị ảnh hưởng. – tadman
Điều này có mùi giống như một phương pháp, mà bất kỳ khuôn khổ kiểm tra phong nha sẽ phù hợp. – zetetic