web-dev-qa-db-fra.com

Quand utiliser `require ',` load` ou `autoload` dans Ruby?

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 "encapsuler" un load dans un module anonyme, require semble être préféré.

Mais alors autoload vous permet de charger des fichiers paresseusement - ce qui semble fantastique mais je ne sais pas exactement ce que vous gagnez sur require

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

60
Mark W

En règle générale, vous devez utiliser require. load rechargera le code à chaque fois, donc si vous le faites à partir de plusieurs modules, vous ferez beaucoup de travail supplémentaire. La paresse de autoload sonne bien en théorie, mais de nombreux modules Ruby font des choses comme le patch de singe d'autres classes, ce qui signifie que le comportement de parties non liées de votre programme peut dépendre de si une classe donnée a déjà été utilisée ou non. autoload est en cours de dépréciation , donc son utilisation doit être évitée.

Si vous souhaitez 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 donc pas à redémarrer votre serveur à chaque fois), utilisez alors load car c'est raisonnable.

62
Brian Campbell

mylibrary.rb

puts "I was loaded!"

class MyLibrary
end

Essayez en 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>

Regarde la différence.

18
crazycrv

voici ce que vous gagnez avec autoload sur require:

autoload sert principalement à accélérer la phase d'initialisation de votre programme Ruby ou Rails. En ne chargeant pas les ressources avant qu'elles ne soient nécessaires, cela peut accélérer un peu les choses.

Un autre avantage est que vous n'aurez peut-être pas besoin de charger certaines parties du code, si l'utilisateur n'utilise pas certaines fonctionnalités - améliorant ainsi le temps de chargement et réduisant l'empreinte mémoire.

12
user979339

Mis à part ce que d'autres vous ont déjà dit, l'avenir de autoload est incertain. Il était prévu de le déprécier en Ruby 2.0, mais la dépréciation n'a pas été faite à temps pour le gel de la fonctionnalité 2.0. Il est désormais prévu que autoload sera déprécié en = Ruby 2.1, mais ce n'est même plus certain .

7
Boris Stitnicky