2010-01-18 11 views
7

Ich habe eine Rails-App, die viele Daten von einigen Java-Diensten lädt. Ich schreibe ein Modul, das mir erlauben wird, einige Auswahlkästchen mit diesen Daten zu füllen, und ich versuche, diese richtig einzuschließen, damit ich sie in meinen Ansichten verweisen kann. Hier mein Modul istRuby-Modul als Sammlung von Methoden

module FilterOptions 
    module Select 

    def some_select 
    return "some information" 
    end 
    end 
end 

Meine Idee war, in meinen Filteroptions application_helper aufzunehmen, und ich dachte, ich könnte dann meine Methoden Referenz Select::some_select Verwendung Dies ist nicht der Fall. Ich muss include FilterOptions::Select dann kann ich die Methode some_select für sich selbst verweisen. Ich will das aber nicht, da ich denke, dass es etwas verwirrend für jemanden ist, der vielleicht nicht weiß, dass some_select von meinem eigenen Modul kommt.

Also, wie ich schreibe Methoden eines Moduls, das wie öffentliche statische Methoden sind, so kann ich mein Hauptmodul, und meine Methoden Referenz unter Verwendung des Sub-Modul-Namensraum wie Select::some_select

Antwort

11

Wenn Sie Modul Methoden definieren, innerhalb der Kontext des Moduls selbst, können sie ohne Import aufgerufen werden:

module FilterOptions 
    module Select 
    def self.some_select 
    return "some information" 
    end 
    end 
end 

puts FilterOptions::Select.some_select 
# => "some information" 

es ist auch möglich, ein Modul zu importieren, und nicht den nächsten importieren, um es beim Namen beziehen sich stattdessen:

include FilterOptions 
puts Select.some_select 
# => "some information" 
+0

ok ich fühle mich irgendwie dumm, ich mache dies in Klassen die ganze Zeit mit Selbst, ich weiß nicht, warum ich dachte, ein Modul wäre anders. BTW Was ist der Unterschied zwischen der Verwendung von Select :: some_select und Select.some_select? – brad

+0

Das ist eine gute Frage. Wenn es um Konstanten geht, müssen Sie die :: Notation verwenden, da es kein Methodenaufruf ist, aber ich denke, dass Sie entweder für Methoden verwenden können. – tadman

12

module_function bewirkt, dass eine Modulfunktion entweder als Instanzmethode oder als Modul-Funktion aufgerufen werden kann:

#!/usr/bin/ruby1.8 

module Foo 

    def foo 
    puts "foo" 
    end 
    module_function :foo 

end 

Foo.foo  # => foo 
Foo::foo  # => foo 

include Foo 
foo   # => foo 

Manchmal möchte man jede Methode in einem Modul ein „Modulfunktion“, aber es kann mühsam bekommen und sich wiederholend, um immer wieder "module_function" zu sagen. In diesem Fall, nur Ihr Modul selbst erweitern:

+0

hey Entschuldigung für die späte Antwort, danke für die Details, ich lerne gerade Metaprogrammierung, also werde ich das in meine Toolbox hinzufügen! – brad

+0

Gern geschehen. Glückliches Hacken! –

Verwandte Themen