include和require在Ruby中有什么区别?

我的问题类似于“ 在Ruby中包含和扩展有什么区别? ”。

在Ruby中requireinclude什么区别? 如果我只是想在我的课程中使用模块的方法,我应该require还是include它?

Ruby中的“include”和“require”有什么区别?

回答:

include和require方法做了非常不同的事情。

require方法在大多数其他编程语言中都包括:运行另一个文件。 它也跟踪你以前需要什么,不会需要两次相同的文件。 要运行另一个没有这个附加function的文件,你可以使用load方法。

include方法从另一个模块中获取所有的方法,并将它们包含到当前模块中。 这是一个语言级别的事情,而不是像文件级别的要求。 include方法是使用其他模块(通常称为混合)“扩展”类的主要方法。 例如,如果你的类定义了“each”方法,你可以包含mixin模块Enumerable,它可以作为一个集合。 这可能会令人困惑,因为包含动词在其他语言中的使用方式非常不同。

资源

所以,如果你只是想使用一个模块,而不是扩展或混合,那么你就需要使用require

奇怪的是,Ruby的require与C的include相似,而Ruby的include则几乎没有像C的include

从Metaprogramming Ruby书中,

require()方法与load()非常相似,但是它的目的不同。 你使用load()来执行代码,并使用require()来导入库。

如果你使用的是模块,那就意味着你要把所有的方法都带到你的课堂上。 如果你用一个模块extend一个类,这意味着你将模块的方法“引入” 方法。 如果你在一个模块中include一个类,这意味着你将模块的方法作为实例方法“引入”。

EX:

  module A def say puts "this is module A" end end class B include A end class C extend A end 

B.say =>未定义的方法'说'为B:类

B.new.say =>这是模块A.

C.say =>这是模块A.

C.new.say =>未定义的方法'说'为C:类

  • Ruby的require更像是在其他语言(如C)中的“包含”。 它告诉Ruby,你想引入另一个文件的内容 。 其他语言的类似机制是:

    • 在C#中using <namespace>指令 。
    • 在Java中import <package>
  • Ruby include是一个用于mixin的面向对象的inheritance机制

这里有一个很好的解释:

简单的答案是,要求和包含是基本无关的。

“require”与C的include类似,这可能会引起新手混淆。 (一个显着的区别是当需求完成时,所需文件中的本地“蒸发”)。

Ruby 包含的内容与C include没有任何区别。 包含语句将一个模块“混合”到一个类中。 这是多重inheritance有限forms 。 包含的模块从字面上赋予包括它的事物上的“是”一个关系。

重点补充。

你有没有试过require一个模块? 结果是什么? 你试一试:

 MyModule = Module.new require MyModule # see what happens 

模块不能被要求,只包括在内!

编程Ruby 1.9

在我们继续之前,我们将就包含声明做几点说明。 首先,它与文件无关。 C编程人员在编译过程中使用一个名为#include的预处理器指令来将一个文件的内容插入到另一个文件中。 Ruby include语句只是简单地引用一个模块。 如果该模块位于单独的文件中,则在使用include之前,您必须使用require(或其不太常用的表亲,加载)来拖动该文件。 其次,Ruby包含不会简单地将模块的实例方法复制到类中。 相反,它从类中引用了包含的模块。 如果多个类包含该模块,它们都指向相同的东西。 如果更改模块中方法的定义,即使程序正在运行,包含该模块的所有类都将显示新的行为。

包括当你将一个模块包含到你的类中时,如下所示,就好像你把模块中定义的代码插入类中,并将其包含在“包含”模块中。 它允许“混入”行为。 它用来干你的代码,以避免重复,例如,如果有多个类需要在模块中相同的代码。

加载load方法与require方法几乎相同,除了不跟踪是否加载了该库。 所以可以多次加载一个库,也可以在使用load方法时指定库文件名的“.rb”扩展名。

要求require方法允许您加载一个库并防止它被多次加载。 如果您尝试在第一次后加载相同的库,则require方法将返回“false”。 require方法只需要使用,如果你正在加载的库被定义在一个单独的文件,这是通常的情况下。

你可以更喜欢这个http://ionrails.com/2009/09/19/ruby_require-vs-load-vs-include-vs-extend/

 require(name) 

它将返回布尔值true / false

作为parameter passing给require的名字,ruby会尝试在你的加载path中find那个名字的源文件。 如果您尝试在第一次后加载相同的库,则require方法将返回“false”。 只有当你正在加载的库被定义在一个单独的文件中时,才需要使用require方法。 所以它跟踪这个库是否已经加载。

 include module_name 

假设你有两种不同的类需要有一些方法。 那么你不必在两个class都写。 相反,你可以做的是,在模块中定义它。 然后在其他类中包含这个模块。 它是由Ruby提供的,只是为了确保DRY原则。 它被用来干你的代码,以避免重复