web-dev-qa-db-ja.com

Rubyで `require`、` load`、または `autoload`を使用する場合

Rubyでのrequireloadautoloadの微妙な違いは理解していますが、私の質問は、どちらを使用するかをどのようにして知るのですか?

loadを匿名モジュールに「ラップ」できることを除いて、requireの方が好ましいようです。

しかしautoloadを使用すると、ファイルを遅延ロードすることができます-素晴らしいように思えますが、実際にrequireで何が得られるかはわかりません

ある方法が他の方法よりも優先されますか? 1つの方法が目立つ状況はありますか?

60
Mark W

通常、requireを使用する必要があります。 loadは毎回コードを再ロードするため、複数のモジュールから実行すると、多くの追加作業が発生します。 autoloadの怠惰は理論的にはいいように聞こえますが、多くのRubyモジュールは、他のクラスのモンキーパッチングなどを実行します。つまり、プログラムの無関係な部分の動作は、特定のクラスがまだ使用されているかどうか autoloadは廃止予定のプロセスです なので、その使用は避けてください。

コードが変更されるたび、または誰かがURLにアクセスするたびにコードをロードする独自の自動リローダーを作成する場合(開発目的のため、毎回サーバーを再起動する必要がないため)、loadそれは合理的です。

62
Brian Campbell

mylibrary.rb

puts "I was loaded!"

class MyLibrary
end

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>

違いを見ます。

18
crazycrv

autoloadrequireを使用すると、次のようなメリットがあります。

autoloadは、主にRubyプログラムまたはRailsアプリケーションの初期化フェーズを高速化するためのものです。必要になるまでリソースをロードしないことにより、かなりスピードアップできます。

別の利点は、ユーザーが特定の機能を使用しない場合、コードの一部をロードする必要がない場合があることです。これにより、ロード時間が改善され、メモリフットプリントが削減されます。

12
user979339

他の人がすでにあなたに言ったことを除いて、autoloadの将来は不確かです。 Ruby 2.0で非推奨となる予定でしたが、2.0機能の凍結に間に合わず非推奨になりました。autoloadが=で非推奨になることが予想されますRuby 2.1、 しかし、それはもはや確実ではありません

7
Boris Stitnicky