Tôi đang cố gắng sử dụng các phương pháp phản xạ trong Ruby, và chạy vào một hành vi mà tôi tìm thấy thực sự surpising.Tại sao lại là Module.methods() và respond_to? hoạt động khác nhau trong irb hơn trong kịch bản?
Các ví dụ sau dường như làm việc khác nhau trong IRB và khi được gọi là một kịch bản ruby:
Ví dụ 1:
def myfun; end
p respond_to?(:myfun)
Trong IRB, điều này nói 'true', Trong kịch bản: 'false' .
Ví dụ 2:
ml = methods
def myfun; end
p methods - ml
Trong IRB, điều này nói [: myfun]. Trong tập lệnh: [].
Tôi thấy điều này dưới 1,8, 1,9 MRI, JRuby 1.5.6, vv - vì vậy tôi cho rằng đây là điều bình thường.
Tại sao là sự khác biệt?
Tôi khá chắc chắn 'respond_to?' là cách để xem liệu một phương thức có sẵn không - tại sao lại không hoạt động trong trường hợp trên?
Rất tốt để biết - thật tuyệt vời Tôi đã không gặp phải điều này sau nhiều năm tiếp xúc với Ruby .. Có, tôi quan tâm đến lý do tại sao IRB công khai họ đang cố gắng thân thiện hơn? :) Tôi có thể thấy lý do tại sao bình thường họ là tư nhân - để tránh nhầm lẫn như "def f; kết thúc; lớp A; kết thúc; A.new.f", hoặc một cái gì đó như thế? – inger
Tôi cũng rất ngạc nhiên khi biết điều này. –
@Semyon Bạn có thể giải thích tại sao các phương thức 'irb' được công khai không? Và tại sao trong 'irb'' myfun' và 'self.myfun' lại đề cập đến cùng một phương thức? – codeit