2009-06-21 12 views
8

yo estaba tratando de entender esta llamada:¿Cómo funciona este método depreciar?

deprecate :new_record?, :new? 

que utiliza este método Desaprobar:

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 

Realmente no entiendo la metaprogramming que está siendo utilizado aquí. Pero, ¿se trata simplemente de otra forma de aliasing del método new_record?? Por lo tanto, en efecto, new_record? todavía está disponible, pero emite una advertencia cuando lo usa? ¿Alguien quiere explicar cómo funciona esto?

Respuesta

10

bien, entonces lo que sucede aquí es que toda la funcionalidad de old_method ha sido movida a new_method por el programador. Para hacer que ambos nombres apunten a la misma funcionalidad, pero tenga en cuenta la desaprobación, el programador coloca la línea deprecate. Esto hace que la cadena especificada en el < -RUBY heredoc (http://en.wikipedia.org/wiki/Heredoc) se interprete como código (evaluado) en el nivel de clase. Las interpolaciones de cadena funcionan igual que en cadenas de rubíes normales.

continuación, el código se ve algo como esto (si tuviéramos que ampliar el metaprogramming)

class SomeClass 
    def new?; true; end 

    deprecate :new_record?, :new? # this generates the following code 

    def new_record?(*args, &block) 
    warn "SomeClass#new_record? is deprecated," + 
      "use SomeClass#new? instead" 
    send(:new?, *args, &block) 
    end 
end 

espero que tenga sentido

+0

Sí, gracias. Eso tiene sentido. Solo una cosa que todavía no entiendo - esta sintaxis: << - RUBY, __FILE__, __LINE__ + 1 Si "<< - RUBY" inicia el heredoc, ¿para qué sirve el resto? Esta parte: __FILE__, __LINE__ + 1 – Hola

+0

Si cambio la definición de deprecated a: "alias_method: new_record?: New?", ¿Tendrá el mismo efecto que el anterior, excepto que no recibiré la advertencia? – Hola

+0

según mi leal saber y entender, sí. La información __FILE__ y __LINE__ son argumentos de posicionamiento opcionales para class_eval. Si faltaban y se generaba una excepción, la traza inversa incluiría algo como '(eval): 3 new_record?'. __FILE__ es el archivo fuente actual y __LINE__ es el número de línea actual, por lo que en caso de falla, la traza inversa apuntará a donde se definió la declaración eval. –

Cuestiones relacionadas