Wann verwendet man `require`,` load` oder `autoload` in Ruby?
Frage
Ich verstehe die feinen Unterschiede zwischen require
, load
und autoload
in Ruby, aber meine Frage ist, wie Sie wissen, welche zu benutzen?
Anders als in der Lage zu „wickeln“ ein load
in einem anonymen Modul scheint require
vorzuziehen.
Aber dann autoload
können Sie faul Last-Dateien - was fantastisch klingt, aber ich bin nicht sicher, praktisch, was Sie über require
gewinnen
Ist ein Verfahren gegenüber dem anderen bevorzugt? Gibt es eine Situation, in der ein Verfahren zeichnet sich durch?
Lösung
Im Allgemeinen sollten Sie require
verwenden. load
wird der Code jedes Mal neu geladen werden, so dass, wenn Sie es aus mehreren Modulen zu tun, werden Sie eine Menge zusätzlicher Arbeit tun. Die lazyness von autoload
klingt gut in der Theorie, aber viele Ruby-Module Dinge tun, wie Affen-Patching anderen Klassen, was bedeutet, dass das Verhalten der unabhängigen Teile des Programms abhängen kann, ob eine bestimmte Klasse hat noch oder nicht verwendet worden. autoload
ist in dem Prozess der veraltet ist, so sollte ihre Verwendung vermieden werden.
Wenn Sie Ihre eigene automatische reloader machen, die Ihren Code lädt jedes Mal, es ändert oder jedes Mal, wenn jemand schlägt eine URL (für die Zwecke der Entwicklung, so dass Sie nicht neu starten müssen, um Ihren Server jedes Mal), dann load
Verwendung für die sinnvoll ist.
Andere Tipps
mylibrary.rb
puts "I was loaded!"
class MyLibrary
end
Versuchen in 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>
Sehen Sie den Unterschied.
Hier ist, was Sie gewinnen mit autoload
über require
:
autoload
ist in erster Linie für die Initialisierungsphase des Ruby-Programms oder Rails-Anwendung zu beschleunigen. Durch den Verzicht auf die Ressourcen geladen, bis sie benötigt werden, kann es durchaus Dinge ein wenig beschleunigen.
Ein weiterer Vorteil ist, dass Sie nicht einige Teile des Codes laden müssen, wenn der Benutzer nicht bestimmte Funktionen nicht verwendet -. Dadurch Verbesserung der Ladezeit und den Speicherbedarf zu reduzieren
Neben was andere Ihnen schon gesagt, Zukunft autoload
ist ungewiss. Es wurde in Ruby 2.0 wird als veraltet geplant, aber die deprecation wurde nicht rechtzeitig für das 2.0 Feature Freeze gemacht. Es wird nun erwartet, dass autoload
wird in Ruby 2.1 veraltet, aber das ist nicht einmal sicher mehr .