2010-04-02 50 views
15

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 

Trả lời

8

Nó đang được tranh luận nếu respond_to? nên tìm kiếm các phương pháp bảo vệ hay không (kiểm tra this issue)

Matz đã tuyên bố rằng nó có thể sẽ thay đổi trong Ruby 2.0.

Lưu ý một số lớp học có thể sử dụng #method_missing và chuyên #respond_to? (hoặc tốt hơn bằng cách chỉ định #respond_to_missing? trong Ruby 1.9.2+), trong trường hợp này obj.methods.include? của bạn sẽ không đáng tin cậy.

+0

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

+0

Trả lời cập nhật với thông tin cập nhật –

11

Từ documentation:

trả về true nếu obj phản ứng với các phương pháp nhất định. Tin và phương pháp bảo vệ có trong tìm kiếm chỉ khi tùy chọn tham số thứ hai để đánh giá đúng

Khi câu hỏi được viết (Ruby 1.8.7):

trả về true nếu obj đáp ứng với phương thức đã cho. Các phương thức riêng được bao gồm trong tìm kiếm chỉ khi tham số thứ hai tùy chọn được đánh giá là đúng.

+1

Câu hỏi là từ năm 2010 Quay lại sau đó trong Ruby 1.8.7 các tài liệu nói rằng: "Trả về true> nếu obj trả lời cho phương thức đã cho. Các phương thức riêng được bao gồm trong tìm kiếm chỉ khi tham số thứ hai tùy chọn được đánh giá là đúng". – steenslag

+1

Vẫn là một câu trả lời có giá trị. Tôi vừa phát hiện ra lỗi này khi nâng cấp một dự án cũ từ Ruby '1.8.7' lên Ruby' 2.1.1'. –

+0

Nó có trên [ruby-doc.org] (http://ruby-doc.org/core-2.2.1/Object.html#method-i-respond_to-3F) ngay bây giờ. –

Các vấn đề liên quan