Nó có thể không rõ ràng như thế nào respond_to? làm việc bằng ruby. Hãy xem xét rằng:respond_to? và phương pháp được bảo vệ
class A
def public_method
end
protected
def protected_method
end
private
def private_method
end
end
obj = A.new
obj.respond_to?(:public_method)
# true - that's pretty obvious
obj.respond_to?(:private_method)
# false - as expected
obj.respond_to?(:protected_method)
# true - WTF?
Vì vậy, nếu 'obj' đáp ứng protected_method chúng ta nên mong đợi
obj.protected_method
không tăng một ngoại lệ, không nên chúng tôi?
... nhưng nó tăng rõ ràng là
Các điểm tài liệu gọi respond_to? với lập luận 2 thiết lập là true phương pháp tư nhân kiểm tra cũng
obj.respond_to?(:private_method, true)
# true
Và đó là xa hợp lý hơn
Vì vậy, câu hỏi là làm thế nào để kiểm tra xem đối tượng đáp ứng chỉ phương pháp nào? Có giải pháp nào tốt hơn không?
obj.methods.include?(:public_method)
# true
obj.methods.include?(:protected_method)
# false
Thật khó để tôi hiểu được bản dịch tiếng Nhật nhưng dù sao cũng tốt khi biết rằng lõi ruby xem xét vấn đề đó. Ít nhất một có thể sử dụng obj.class.public_method_defined? (: Protected_method) và nó hoạt động như mong đợi nhưng sẽ không xử lý các phương thức singleton, vì vậy tôi xem xét rằng giải pháp không phải là giải pháp thực – mlomnicki
Trả lời cập nhật với thông tin cập nhật –