2014-05-22 13 views
5

tôi nên có thể gọi Kernel phương pháp trên tất cả các đối tượng, và phương pháp format được định nghĩa trên Kernel. Tại sao method_missing gọi trên Kernel với ví dụ thứ ba?Tại sao phương pháp Kernel nhìn lên chỉ khi `send` được sử dụng?

class A 
    def method_missing(meth, *args, &block) 
    if meth == :foo 
     puts 'ok' 
    elsif meth == :format 
     puts 'ok' 
    end 
    end 
end 

a = A.new 
a.foo   # => ok 
a.send(:foo) # => ok 
a.format  # => ok 
a.send(:format) # => too few arguments (ArgumentError) 

Trả lời

7

Đó là bởi vì Kernel#format là một phương pháp riêng. Khi bạn gọi nó bằng cách sử send, có nghĩa là bạn đang gọi nó mà không có một máy thu rõ ràng, phương pháp định nghĩa được gọi, và lỗi lập luận được nâng lên. Khi bạn gọi nó với một máy thu rõ ràng, phương pháp này không được tìm thấy bởi vì một trong những định nghĩa là tư nhân, và do đó method_missing được gọi.

+1

Thay đổi câu trả lời được chấp nhận với trang này, vì nó thực sự giải thích 'send' vs không phù hợp cuộc gọi trực tiếp tốt hơn. –

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