2011-07-26 4 views
2

Je viens de commencer à apprendre Ruby en Java. En Java, vous utiliseriez des paquets pour des projets plus importants. Y a-t-il quelque chose d'équivalent à cela dans Ruby? Ou quelle est la meilleure façon d'obtenir un package comme paramètre?Utiliser des paquets dans Ruby?

La façon dont je le fais en ce moment est de 'charger' toute la classe nécessaire dans mon nouveau fichier Ruby. N'y a-t-il pas un moyen de dire à ma classe Ruby actuelle d'utiliser toutes les autres classes Ruby dans le même dossier?

Cheers, Mike

Répondre

1

Il y a trois types de chargement de package dans Ruby:

  • chargement Explicitement une bibliothèque require
  • chargement Implicitement une bibliothèque à l'aide autoload
  • Importation d'une bibliothèque gem

Le require la méthode est la plus directe et a l'effet de charger et d'exécuter ce par fichier spécifique. Étant donné que ce fichier peut aller jusqu'à require autres, par commodité, vous pouvez finir par charger beaucoup en même temps.

La méthode autoload déclare un module qui sera chargé si vous faites référence à un symbole donné. C'est une méthode courante pour éviter de charger des choses dont vous n'avez pas besoin, mais les rendre automatiquement disponibles si vous le faites. La plupart des grandes bibliothèques utilisent cette méthode de chargement pour éviter de déverser toutes les classes dans la mémoire à la fois.

L'approche gem est une façon plus formelle d'emballage une bibliothèque. Bien qu'il soit rare que les applications soient divisées en une ou plusieurs gemmes, cela est possible et offre certains avantages. Il n'y a aucune obligation de publier un gem en open-source, vous pouvez le garder privé et le distribuer par vos propres canaux, soit un site web privé ou un dépôt git, ou simplement copier et installer le fichier .gem comme requis.

Cela étant dit, si vous voulez faire une bibliothèque qui charge automatiquement un tas de choses, vous pourriez prendre cette approche:

# lib/example.rb 
Dir.glob(File.expand_path('example/**/*.rb', File.dirname(__FILE__))).each do |file| 
    require file 
end 

Cela charge tous les .rb fichiers lib/example lorsque vous appelez require 'example'.

0

Je comprends votre sentiment. C'est un problème ordinaire auquel vous devez faire face en venant d'une autre langue comme Java. Je dirais essayer d'étudier les modules Ruby mais vous méritez une réponse plus longue. Donc, mon conseil est de lire un bon livre Ruby comme Eloquent Ruby.

+0

Comment les modules sont-ils liés à cette question? –

+1

Quand vous venez de Java organiser des choses est une chose très difficile à comprendre. Je sais que Mike demandait comment charger tous les fichiers dans un dossier. J'essayais juste de lui donner un indice sur un problème plus complexe. Et si vous essayez de charger tous les fichiers dans un dossier, vous n'organisez pas votre code. Je connais parfaitement son feeling car j'ai le même background Java. – lucapette

+0

Il parlait de l'équivalent de l'emballage Java. Ce sont des modules et nécessitent, pas seulement besoin. – Andy

1

Vous voulez probablement utiliser require plutôt que la charge, car il doit prendre soin des références circulaires.

Si vous voulez récupérer tous les fichiers dans un dossier donné, c'est assez facile:

Dir.foreach("lib"){|x| require x} 

Votre autre option est d'avoir un fichier qui nécessite manuellement tout, et que vos autres fichiers exigent.

Vous devriez également envisager d'envelopper le code dans vos bibliothèques avec un bloc module, pour leur donner leurs propres espaces de noms. Cela dit: à tort ou à raison, j'ai tendance à penser que c'est le seul domaine - peut-être le seul - où Ruby est moins puissant que Python, disons, ou Java.

Questions connexes