2009-12-29 20 views
15

Ho il seguente codice Ruby:Chiamare un metodo su un modulo Rubino

module MyModule 
    class MyClass 
    def self.my_method 
    end 
    end 
end 

Per chiamare my_method, io entro MyModule::MyClass.my_method. Mi piacerebbe scrivere un wrapper per my_method sul modulo stesso:

MyModule.my_method 

è possibile?

risposta

13

Metodo semplice:

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

Harder metodo:

Usa metaprogrammazione a scrivere una funzione per tutti i casi (come attr_accessor).

+0

Penso di sapere ora perché non ha funzionato prima: ho avuto la dichiarazione MyModule.my_method in un file (my_module.rb) e il MyModule :: MyClass.my_method in un altro file (my_class.rb). Quando ho inserito il metodo precedente in my_class.rb, MyModule.my_method ha funzionato! – gsmendoza

+0

Modo più semplice: richiede 'inoltro'. –

8

È possibile definire il metodo direttamente all'interno del modulo.

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

MyModule.my_method #=> Hi I am MyModule 
27

Non sono sicuro di cosa stai cercando di ottenere, ma: se lo fai con un metodo regolare e lo modifichi con module_function, potrai chiamarlo come preferisci.

#!/usr/bin/ruby1.8 

module MyModule 

    def my_method 
    p "my method" 
    end 
    module_function :my_method 

end 

Dopo aver fatto questo, si può sia includere il modulo e chiamare il metodo come metodo di istanza:

class MyClass 

    include MyModule 

    def foo 
    my_method 
    end 

end 

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

o si può chiamare il metodo come metodo di classe del modulo:

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

Nel tuo caso, puoi chiamare il tuo metodo sul tuo modulo? Non hai bisogno di te di fronte a my_method? – Jwan622

+1

@ Jwan622 Ho cercato di migliorare la mia risposta. Risponde alla tua domanda ora? –

Problemi correlati