在Ruby中load和require有什么不同?

Ruby on Rails应用程序中的loadrequire之间是否有任何主要区别? 还是他们都有相同的function?

require在所有定义的searchpath中search库,并将.rb或.so添加到您input的文件名中。 它也确保图书馆只包括一次。 所以,如果您的应用程序需要库A和B以及库B请求库A,那么A将只加载一次。

load ,需要添加库的全名,每次调用load时都会加载它 – 即使它已经在内存中。

Kernel#requireKernel#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)