Próbuję użyć metod refleksyjnych w Ruby i uruchomić zachowanie, które naprawdę mnie przerasta.Dlaczego Module.methods() i respond_to? działa inaczej w irb niż w skrypcie?
Poniższe przykłady wydaje się inaczej działa w IRB i po wywołaniu skryptu Ruby:
Przykład 1:
def myfun; end
p respond_to?(:myfun)
W IRB, to mówi 'prawdziwy', W skrypcie: 'false' .
Przykład 2:
ml = methods
def myfun; end
p methods - ml
W IRB Mówi [: myfun]. W skrypcie: [].
Znalazłem to pod 1.8, 1.9 MRI, JRuby 1.5.6, itd. - więc zakładam, że to jest normalne.
Dlaczego różnica?
Byłem prawie pewien, że "odpowiedź"? jest sposobem sprawdzenia, czy dana metoda jest dostępna - dlaczego to nie działa w powyższym przypadku?
Bardzo dobrze wiedzieć - to niesamowite, nie natknąłem się na to po latach ekspozycji Rubiego. Tak, interesuje mnie, dlaczego IRB sprawia, że są publiczni, że stara się być bardziej przyjazny - czyż nie? :) Rozumiem, dlaczego zwykle są prywatne - aby uniknąć pomyłek takich jak "def f; end; class A; end; A.new.f", czy coś w tym stylu? – inger
Byłem zaskoczony, gdy się tego nauczyłem. –
@ Siemio Czy możesz wyjaśnić, dlaczego metody 'irb' są publiczne? A dlaczego w 'irb'' myfun' i 'self.myfun' odnosi się do tej samej metody? – codeit