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?
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.
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.
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.
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 .