2016-05-11 12 views
0

Unterhalb der Beispielmodule (n Nummern), die ich in meinem Projekt verwende, mit dem gleichen Methodennamen (s) mit unterschiedlichem Rückgabewert (Präfix mit Modulname).ruby ​​- Module dynamisch definieren

module Example1 
def self.ex_method 
    'example1_with_' 
end 
end 


module Example2 
def self.ex_method 
    'example2_with_' 
end 
end 

Ich habe versucht, dies mit Metaprogrammierung wie #define_method zu erreichen. Aber es funktioniert nicht für mich. Gibt es einen Weg, es zu tun?

array.each do |name| 
    Object.class_eval <<TES 
    module #{name} 
     def self.ex_method 
     "#{name.downcase}_with_" 
     end 
    end 
    TES 
end 

Fehler Snap: Sie in der letzten Zeile sehen konnte, sagt, dass es nicht abgeschlossen ist.

enter image description here

+0

"funktioniert nicht" ist keine gute Definition. Was ist das Problem? Welche Fehlermeldungen haben Sie erhalten? –

+0

Keine Fehler. Wenn ich in der 'irb' versuchte, sagt der Befehl, immer noch ist die Methode nicht mit Ende geschlossen. Warum 'ist nicht eine gute Definition'? –

+1

Warum ist es keine gute Definition? Weil Sie keine Details über Fehlermeldungen wie einen Stacktrace oder so geben. Geben Sie so viele (relevante) Details wie möglich an, damit wir das Problem leicht verstehen können. Vielleicht können Sie etwas Licht auf warum Sie so etwas implementieren möchten? –

Antwort

6
m = Object.const_set("Example1", Module.new) 
    #=> Example1 
m.define_singleton_method("ex_method") { 'example1_with' } 
    #=> :ex_method 

Mal sehen:

Example1.is_a? Module 
    #=> true 
Example1.methods.include?(:ex_method) 
    #=> true 
Example1.ex_method 
    #=> "example1_with" 
4

NB: Ich würde die Lösung von Cary bereitgestellt verwenden, da es mehr idiomatische ist.

Jetzt beantworten wir die Frage wie in OP angegeben.

Das Problem ist mit heredoc

Object.class_eval <<TES 

ist mit TESin der ersten Position geschlossen werden. Zu schließen, wie Sie das tun, verwenden:

#     ⇓ HERE 
Object.class_eval <<-TES 
+0

Danke. Es funktioniert. Kannst du mir sagen, was ist '-'? –

+0

@ Mr.Black: Es ermöglicht einige Einrückung für die schließende Kennung. http://ruby-doc.org/core-2.2.0/doc/syntax/literals_rdoc.html –

+0

http://rubyquicktips.com/post/4438542511/heredoc-and-indent – mudasobwa

Verwandte Themen