2010-01-18 2 views
7

J'ai une application rails qui charge beaucoup de données de certains services Java. Je suis en train d'écrire un module qui me permettra de remplir certaines cases avec ces données et j'essaie de les inclure correctement afin que je puisse les référencer dans mes vues. Voici mon moduleRuby module comme collection de méthodes

module FilterOptions 
    module Select 

    def some_select 
    return "some information" 
    end 
    end 
end 

Mon idée était d'inclure FilterOptions dans mon application_helper, et je pensais que je pourrais alors faire référence à mes méthodes en utilisant Select::some_select Ce n'est pas le cas. Je dois include FilterOptions::Select alors je peux faire référence à la méthode some_select par elle-même. Je ne veux pas que ce soit parce que je pense que c'est un peu déroutant pour quelqu'un qui ne sait pas que some_select vient de mon propre module.

Alors, comment puis-je écrire des méthodes d'un module qui sont comme des méthodes statiques publiques, donc je peux comprendre mon module principal, et la référence à mes méthodes en utilisant l'espace de noms sous-module comme Select::some_select

Répondre

11

Si vous définissez les méthodes de module au sein le contexte du module lui-même, ils peuvent être appelés sans l'importation:

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

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

il est également possible d'importer un module, et ne pas importer le prochain, reportez-vous à la place par son nom:

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

ok je me sens un peu stupide, je le fais dans les classes tout le temps avec soi-même, je ne sais pas pourquoi je pensais un module serait différent. BTW quelle est la différence entre l'utilisation de Select :: some_select et Select.some_select? – brad

+0

C'est une bonne question. Quand il s'agit de constantes, vous devez utiliser la notation :: car ce n'est pas un appel de méthode, mais je pense que vous pouvez utiliser soit pour les méthodes. – tadman

12

module_function provoque une fonction de module appelables soit comme une méthode d'instance ou en fonction du module:

#!/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 

Parfois, vous voulez que chaque méthode dans un module pour une « fonction du module », mais il peut être fastidieux et répétitif pour continuer à dire "fonction_module" encore et encore. Dans ce cas, juste avoir votre module se prolonger:

!/usr/bin/ruby1.8 

module Foo 

    extend self 

    def foo 
    puts "foo" 
    end 

end 

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

include Foo 
foo   # => foo 
+0

hé désolé pour la réponse tardive, merci pour les détails, je suis en train d'apprendre la métaprogrammation maintenant, donc je vais ajouter cela dans ma boîte à outils! – brad

+0

De rien. Joyeux piratage! –