2009-06-26 6 views
32

Pendant un certain temps, j'avais inclus une classe entière à l'intérieur d'un module Ruby. Apparemment, ce n'est pas ce que je suis censé faire. Il semble que le but d'un module est de stocker des fonctions qui peuvent ensuite être incluses en tant que méthodes dans une nouvelle classe.Y compris une classe Ruby à partir d'un fichier séparé

Je ne veux pas ça. J'ai une classe que je veux conserver dans un fichier séparé auquel je peux accéder à partir d'autres fichiers. Comment puis-je faire ceci?

Merci.

+0

Ce message clarifie l'expression require_relative dans le cas où vous rencontrez des problèmes avec l'exemple ci-dessus lorsque sur Ruby> = 1.9.2 [Ruby require_relative example] (http://stackoverflow.com/questions/3672586/what-is -require-relative-en-rubis) – Dirk

Répondre

55

Les modules servent à la fois de support pour les fonctions et d'espace de noms. Garder les classes dans les modules est parfaitement acceptable. Pour mettre une classe dans un fichier séparé, il suffit de définir la classe comme d'habitude, puis dans le fichier où vous souhaitez utiliser la classe, mettez simplement require 'name_of_file_with_class' en haut. Par exemple, si j'ai défini la classe Foo dans foo.rb, dans bar.rb j'aurais la ligne require 'foo'.

Si vous utilisez Rails, cela arrive souvent comprennent automagiquement

Edit: clarification de la mise en page du fichier

#file: foo.rb 
class Foo 
    def initialize 
    puts "foo" 
    end 
end 

...

#file: bar.rb 
require 'foo' 

Foo.new 

Si vous êtes dans Rails, mettez ces classes dans lib/ et d'utiliser la convention de nommage pour les fichiers de la version underscored minuscule du nom de classe, par exemple Foo ->foo.rb, FooBar ->foo_bar.rb, etc.

de la version 1.9 rubis, vous pouvez utiliser require_relative, pour exiger des fichiers relativement au fichier que vous modifiez.

+0

merci, très utile. pourriez-vous clarifier cette dernière phrase? il semble que vous ayez eu une faute de frappe (?). Si la classe foo est stockée dans bar.rb, j'ai besoin de 'foo' dans bazcontroller.rb? Alors foo.new est utilisable dans bazcontroller.rb? – user94154

+9

Peut-être que ce serait bien d'ajouter des informations sur 'require_relative' pour Ruby 1.9 puisque le code ne fonctionne pas pour cette version. – boutta

+2

@boutta Merci pour la clarification de la version 1.9, ceci a résolu mon problème. – DorkRawk

Questions connexes