2009-04-29 6 views
49

Je comprends les différences subtiles entre require, load et autoload dans Ruby, mais ma question est, comment savez-vous lequel utiliser? En plus de pouvoir "envelopper" un load dans un module anonyme, require semble être préféré.Quand utiliser `require`,` load` ou `autoload` dans Ruby?

Mais autoload vous permet de charger des fichiers paresseux - ce qui semble fantastique, mais je ne suis pas sûr pratiquement ce que vous gagnez plus require

est une méthode préférée sur l'autre? Y a-t-il une situation où une méthode se démarque?

Répondre

50

Généralement, vous devez utiliser require. load va recharger le code à chaque fois, donc si vous le faites à partir de plusieurs modules, vous allez faire beaucoup de travail supplémentaire. Le labyrinthe de autoload semble bien en théorie, mais de nombreux modules Ruby font des choses comme le patching d'autres classes, ce qui signifie que le comportement des parties non liées de votre programme peut dépendre de l'utilisation ou non d'une classe donnée. autoload has also been deprecated, donc son utilisation devrait être évitée. Si vous voulez créer votre propre chargeur automatique qui charge votre code chaque fois qu'il change ou chaque fois que quelqu'un frappe une URL (à des fins de développement, vous n'avez pas besoin de redémarrer votre serveur à chaque fois), utilisez load pour c'est raisonnable.

+14

Je pense que 'autoload' sera obsolète dans les prochaines versions de Ruby, selon un [commentaire] (http://www.ruby-forum.com/topic/3036681) de matz. –

+2

Voir la réponse de Boris ci-dessous qui contient un lien vers une discussion plus récente concernant autoload. Il est toujours présent dans 2.1: http://ruby-doc.org/core-2.1.0/Module.html#method-i-autoload –

+3

Nous voici 7 ans après cette réponse. L'autoload a-t-il été déprécié? – Donato

10

voici ce que vous gagnez avec autoload sur require:

autoload est principalement pour accélérer la phase d'initialisation de votre programme Ruby ou de l'application Rails. En ne chargeant pas les ressources jusqu'à ce qu'elles soient nécessaires, cela peut accélérer un peu les choses. Un autre avantage est que vous n'avez pas besoin de charger certaines parties du code si l'utilisateur n'utilise pas certaines fonctions, ce qui améliore le temps de chargement et réduit l'empreinte mémoire.

14

mylibrary.rb

puts "I was loaded!" 

class MyLibrary 
end 

Essayez dans irb

irb(main):001:0> require 'mylibrary' 
I was loaded! 
=> true 

irb(main):001:0> autoload :MyLibrary, 'mylibrary' 
=> nil 
irb(main):002:0> MyLibrary.new 
I was loaded! 
=> #<MyLibrary:0x0b1jef> 

Voyez la différence.

+3

La question asker connaît la différence entre require et autoload, il demandait quand vous devriez utiliser un plutôt que l'autre. –

+1

Merci Andrew de l'avoir signalé. Tu as raison. Comme mentionné par l'utilisateur979339 ci-dessus ..autoload devrait être utilisé lorsque le temps est critique et que vous voulez encore accélérer le processus. Par exemple dans les serveurs d'applications comme "mince". Si vous regardez le code source, alors vous découvrirez que l'auteur a utilisé autoload au lieu de require pour charger les parties centrales de thin comme la commande, la connexion et la journalisation de cette accélération. – crazycrv

+0

Vous devez faire attention aux bibliothèques qui ne sont pas enregistrées avec Ruby stdlib et rubygems. Par conséquent, vous devez utiliser './filename-no ext' comme exemple pour une bibliothèque locale. Peut-être pourriez-vous corriger cela dans votre code, puis supprimer mon commentaire? Mais merci pour l'exemple simple. Mais qu'en est-il de 'charger'? –

6

En dehors de ce que d'autres vous ont déjà dit, l'avenir de autoload est incertain. Il a été programmé pour être obsolète dans Ruby 2.0, mais la dépréciation n'a pas été faite à temps pour le gel des fonctionnalités 2.0. Il est maintenant prévu que autoload sera obsolète dans Ruby 2.1, but that is not even certain anymore.

Questions connexes