Sto provando a usare i metodi riflessivi in Ruby e sto imbattendo in un comportamento che trovo davvero sorprendente.Perché Module.methods() e respond_to? funziona diversamente in irb che in script?
Gli esempi che seguono sembra funzionare in modo diverso in IRB e quando viene chiamato uno script ruby:
Esempio 1:
def myfun; end
p respond_to?(:myfun)
In IRB, questo dice 'vero', In script: 'false' .
Esempio 2:
ml = methods
def myfun; end
p methods - ml
In IRB, questo dice [: myfun]. Nella sceneggiatura: [].
Ho trovato questo sotto 1.8, 1.9 MRI, JRuby 1.5.6, ecc., Quindi presumo che questo sia normale.
Perché la differenza?
Ero abbastanza sicuro di rispondere "a?" è il modo di vedere se un metodo è disponibile - perché non funziona nel caso precedente?
Molto buono a sapersi - è incredibile che non mi sia imbattuto in questo dopo anni di esposizione Ruby .. Sì, mi interessa perché IRB li rende pubblici sta cercando di essere più amichevole-è vero? :) Capisco perché normalmente sono privati - per evitare confusione come "def f; end; class A; end; A.new.f", o qualcosa del genere? – inger
Sono stato sorpreso di imparare anche questo. –
@Semyon Puoi spiegare perché i metodi 'irb' sono pubblici? E perché in 'irb'' myfun' e 'self.myfun' si riferiscono allo stesso metodo? – codeit