在Ruby中load和require有什么不同?
Ruby on Rails应用程序中的load
和require
之间是否有任何主要区别? 还是他们都有相同的function?
require
在所有定义的searchpath中search库,并将.rb或.so添加到您input的文件名中。 它也确保图书馆只包括一次。 所以,如果您的应用程序需要库A和B以及库B请求库A,那么A将只加载一次。
load
,需要添加库的全名,每次调用load
时都会加载它 – 即使它已经在内存中。
Kernel#require
和Kernel#load
之间的另一个区别是, Kernel#load
带有一个可选的第二个参数,它允许你将加载的代码包装到一个匿名的空模块中。
不幸的是,这不是很有用。 首先,通过访问全局命名空间, load
代码很容易脱离模块,也就是说,它们仍然可以像class ::String; def foo; end end
那样进行monkeypatch class ::String; def foo; end end
class ::String; def foo; end end
class ::String; def foo; end end
。 其次, load
不会返回包装代码的模块,所以你基本上必须手工将它从ObjectSpace::each_object(Module)
。