何时在Ruby中使用`require`,`load`或`autoload`?

Mar*_*k W 61 ruby module

我理解之间的细微差异require,load以及autoload在Ruby中,但我的问题是,你怎么知道该用哪一个呢?

除了能够load在匿名模块中"包装"a之外,require似乎更受欢迎.

但是然后autoload允许你懒惰加载文件 - 听起来很棒但我不确定你获得了什么require

一种方法比另一种方法更受欢迎吗?是否存在一种方法脱颖而出的情况?

Bri*_*ell 62

一般来说,你应该使用require.load每次都会重新加载代码,所以如果你从几个模块中执行它,你将会做很多额外的工作.autoload声音的懒惰在理论上很好,但许多Ruby模块执行诸如猴子修补其他类之类的操作,这意味着程序中不相关部分的行为可能取决于给定类是否已被使用.load正在被弃用,因此应避免使用它.

如果您想制作自己的自动重新加载器,每次更改时或每次有人点击URL时加载您的代码(为了开发目的,您不必每次都重新启动服务器),那么使用require它是合理的.

  • 不,它仍然是Ruby 2.3.0的一部分:http://ruby-doc.org/core-2.3.0/Kernel.html#method-i-autoload,但根据此bug中的讨论(https ://bugs.ruby-lang.org/issues/5653)可能的目标是Ruby 3.0. (6认同)
  • 请参阅下面的Boris回答,其中包含有关自动加载的最新讨论的链接.它仍然存在于2.1:http://ruby-doc.org/core-2.1.0/Module.html#method-i-autoload (2认同)

cra*_*crv 18

mylibrary.rb

puts "I was loaded!"

class MyLibrary
end
Run Code Online (Sandbox Code Playgroud)

试试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>
Run Code Online (Sandbox Code Playgroud)

看到不同.

  • 问题提问者知道要求和自动加载之间的区别,他问你何时应该使用一个而不是另一个. (4认同)

小智 12

这里是你得到什么autoloadrequire:

autoload主要用于加速Ruby程序或Rails应用程序的初始化阶段.通过在需要之前不加载资源,它可以加速相当多的事情.

另一个优点是,如果用户不使用某些功能,您可能不需要加载代码的某些部分 - 从而缩短加载时间并减少内存占用.


Bor*_*cky 6

除了别人已经告诉你的,未来的autoload不确定性.它计划在Ruby 2.0中弃用,但是对于2.0功能冻结没有及时弃用.现在预计autoload将在Ruby 2.1中弃用,但这甚至不再确定.

  • 该功能线程已被关闭,并决定“autoload”不会被弃用。https://bugs.ruby-lang.org/issues/5653#note-46 (3认同)