2010-12-15 7 views
5

In meiner app, ich habeWie beziehe ich mich auf den vollständigen Pfad eines Submoduls in Ruby?

VeryUniqueModule::Foo 
# and… 
VeryUniqueModule::Bar 

Foo und Bar jeweils für einen anderen Dienst. Ein Teil meiner App muss dynamisch herauszufinden, welches Modul zu beziehen, was es tut, wie so kompetent:

def service_api 
    # @relevant_object.service is a string that is either 'Foo' or 'Bar' 
    VeryUniqueModule.const_get(@relevant_object.service) 
end 

Mehr dazu später.

Ich habe gerade eine Bibliothek aktualisiert, und es hat jetzt eine eigene Foo Klasse der obersten Ebene (die schlechtes Design ihrerseits ist). Wenn ich jetzt versuche, @relevant_object.service_api::A_CONSTANT aufzurufen, beschwert sich meine App, dass die -BibliothekFooA_CONSTANT nicht hat.

Zurück zu service_api oben - ich dachte, dass const_get die Klasse selbst zurück gab. Tatsächlich weiß ich, dass es ist. Wenn ich es in irb fire alles ist wie erwartet - der Rückgabewert ist die Klasse selbst, und ich kann Dinge in der Klasse aufrufen. So ...

  1. Wie ist es möglich, dass es einen Namespace-Konflikt in erster Linie gibt? Ich suche auf dem Klassenobjekt zurückgegeben von service_api, nicht auf eine Zeichenfolge, die ich eval ing oder etwas so funky - es sollte keine Namespace-Probleme, ich verweise direkt auf ein Objekt !
  2. Wenn dies in der Tat ein Problem ist, wie kann ich service_api beheben, so dass es die, ähm, "vollständigen Pfad" zurückgibt?
+0

Was Sie tun, scheint in Ordnung zu sein. Wahrscheinlich gibt es irgendwo anders einen Fehler. –

Antwort

0

Sie könnten versuchen, diese:

VeryUniqueModule.const_get('::VeryUniqueModule::' + @relevant_object.service) 

Und wenn das nicht funktioniert, könnten Sie versuchen service_api umgehen und dies zu tun, wo immer Sie A_CONSTANT brauchen:

Object.const_get('::VeryUniqueModule::' + @relevant_object.service + '::A_CONSTANT') 

Notiere die :: vor VeryUniqueModule. Ich denke nicht, dass es in diesem Fall unbedingt notwendig ist, aber es könnte nützlich sein, dass es garantiert, dass Ruby im globalen Namespace nach VeryUniqueModule sucht und nicht in einem anderen Modul.

+0

Es gibt keine Möglichkeit, dass das funktioniert. 'const_get' akzeptiert nur den Namen von constant, jedes' '' muss auf andere Weise behandelt werden. Zum Beispiel: Klasse A; B = 42; Ende; Object.const_get ("A :: B") # => NameError: falscher Konstantenname A :: B' –

Verwandte Themen