2009-12-29 29 views
15

Tengo el siguiente código Ruby:Llamar a un método en un módulo de Rubí

module MyModule 
    class MyClass 
    def self.my_method 
    end 
    end 
end 

Para llamar my_method, entro MyModule::MyClass.my_method. Me gustaría escribir un contenedor para my_method en el propio módulo:

MyModule.my_method 

Es esto posible?

Respuesta

13

Método sencillo:

module MyModule 
    def self.my_method(*args) 
    MyModule::MyClass.my_method(*args) 
    end 
end 

Harder método:

Uso metaprogramming a escribir una función para todos los casos (como attr_accessor).

+0

Creo que ahora sé por qué no funcionó: tenía la declaración MyModule.my_method en un archivo (my_module.rb) y MyModule :: MyClass.my_method en otro archivo (my_class.rb). Cuando puse el método anterior dentro de my_class.rb, MyModule.my_method funcionó. – gsmendoza

+0

Manera más fácil: requiere 'reenviables'. –

8

Puede definir el método directamente dentro del módulo.

module MyModule 
    def self.my_method 
    puts "Hi I am #{self}" 
    end 
end 

MyModule.my_method #=> Hi I am MyModule 
27

No estoy seguro de lo que está tratando de lograr, pero si lo convierte en un método normal y lo modifica con la función module_function, podrá llamarlo de la manera que elija.

#!/usr/bin/ruby1.8 

module MyModule 

    def my_method 
    p "my method" 
    end 
    module_function :my_method 

end 

Una vez hecho esto, es posible que sea incluir el módulo y llamar al método como un método de instancia:

class MyClass 

    include MyModule 

    def foo 
    my_method 
    end 

end 

MyClass.new.foo  # => "my method" 

o puede llamar al método como un método de clase en el módulo:

MyModule.my_method # => "my method" 
+0

En su caso, ¿puede llamar a su método en su módulo? ¿No necesitas ser yo mismo frente a my_method? – Jwan622

+1

@ Jwan622 He intentado mejorar mi respuesta. ¿Responde a tu pregunta ahora? –

Cuestiones relacionadas