2011-06-13 11 views
5

Cuando se trata de introspección de tiempo de ejecución y generación de código dinámico, no creo que Ruby tenga rivales, excepto posiblemente para algunos dialectos de lisp. El otro día estaba haciendo un ejercicio de código para explorar las instalaciones dinámicas de ruby ​​y comencé a preguntarme cómo agregar métodos a los objetos existentes. Aquí hay 3 formas que se me ocurrieron:¿De cuántas maneras se pueden agregar métodos a un objeto Ruby?

obj = Object.new 

# add a method directly 
def obj.new_method 
    ... 
end 

# add a method indirectly with the singleton class 
class << obj 
    def new_method 
    ... 
    end 
end 

# add a method by opening up the class 
obj.class.class_eval do 
    def new_method 
    ... 
    end 
end 

Esto es sólo la punta del iceberg, porque todavía no he explorado varias combinaciones de instance_eval, module_eval y define_method. ¿Hay algún recurso en línea/fuera de línea en el que pueda obtener más información sobre estos trucos dinámicos?

Respuesta

3

Si obj tiene una superclase, puede agregar métodos para obj de la superclase utilizando define_method(API) como usted ha mencionado. Si miras el código fuente de Rails, notarás que lo hacen un poco.

Asimismo, mientras que esto no es exactamente lo que estás pidiendo, puede fácilmente dar la impresión de crear un número casi infinito de forma dinámica, utilizando métodos method_missing:

def method_missing(name, *args) 
    string_name = name.to_s 
    return super unless string_name =~ /^expected_\w+/ 
    # otherwise do something as if you have a method called expected_name 
end 

Agregando que a su clase lo hará permiten dar respuesta a cualquier llamada al método que se parece a

@instance.expected_something 
Cuestiones relacionadas