Stavo cercando di capire questo invito:Come funziona questo metodo deprecate?
deprecate :new_record?, :new?
che utilizza questo metodo deprecate:
def deprecate(old_method, new_method)
class_eval <<-RUBY, __FILE__, __LINE__ + 1
def #{old_method}(*args, &block)
warn "\#{self.class}##{old_method} is deprecated," +
"use \#{self.class}##{new_method} instead"
send(#{new_method.inspect}, *args, &block)
end
RUBY
end
io non capisco la metaprogrammazione che viene usata qui. Ma questo è solo un altro modo di fare l'aliasing del metodo new_record?
- quindi, in effetti, new_record?
è ancora disponibile ma emette un avviso quando lo si utilizza? Qualcuno vorrebbe spiegare come funziona?
Sì, grazie. Ciò ha senso. Solo una cosa ancora non capisco - questa sintassi: << - RUBY, __FILE__, __LINE__ + 1 Se "<< - RUBY" avvia l'heredoc, a cosa serve il resto? Questa parte: __FILE__, __LINE__ + 1 – Hola
Se cambio la definizione da deprecate a: "alias_method: new_record ?,: new?", Avrà lo stesso effetto di quanto sopra, tranne che non riceverò l'avviso? – Hola
al meglio delle mie conoscenze, sì. Le informazioni __FILE__ e __LINE__ sono argomenti di posizionamento opzionali per class_eval. Se mancavano e veniva sollevata un'eccezione, il backtrace includeva qualcosa come '(eval): 3 new_record?'. __FILE__ è il file sorgente corrente e __LINE__ è il numero di riga corrente, quindi in caso di errore, il backtrace indicherà dove è stata definita l'istruzione eval. –