Ruby中include和require的区别是什么?

我的问题类似于“Ruby中include和extend的区别是什么?”。

在Ruby中requireinclude之间有什么区别?如果我只想使用类中某个模块的方法,我应该require它还是include它?

270757 次浏览

有什么区别 “include”和“require”?< / em > < / p >

答:

include和require方法do

require方法执行包含的内容 在大多数其他编程中 语言:运行另一个文件。它还 对象中所需要的内容 过去和将不需要相同的文件 两次。运行另一个文件 这个附加的功能,您可以使用 加载方法。

include方法获取所有 方法从另一个模块和 将它们包含到当前模块中。 这是一个语言级别的事情 而不是文件级的东西 要求。include方法是 “扩展”类的主要方法 其他模块(通常称为 mix - in)。例如,如果你的班级 定义方法“each”,你可以 包括mixin模块Enumerable 它可以作为一个集合。这 像包含动词一样容易混淆 在其他地方的用法非常不同 语言。< / p >

Source .

因此,如果你只是想使用一个模块,而不是扩展它或进行混合,那么你将需要使用require

奇怪的是,Ruby的require类似于C的include,而Ruby的include几乎与C的include完全不同。

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

    有一个很好的解释在这里:

    简单的答案是require和include本质上是不相关的。

    “需要”类似于C include,这可能会导致新手混淆。 (一个显著的区别是所需文件中的局部变量“蒸发”了 当require完成时)

    Ruby 包括与C include完全不同。include语句将一个模块“混合”到一个类中。这是一个有限形式 多重继承。一个被包含的模块字面上赋予了一个“is-a”

    重点补充道。

在Ruby元编程书中,

require()方法与load()方法非常相似,但它是用于 不同的目的。你使用load()来执行代码,你使用 require()导入库
如果你正在使用一个模块,这意味着你将所有的方法带入你的类。 如果你extend一个带有模块的类,这意味着你将模块的方法作为方法“引入”。 如果你include一个带有模块的类,这意味着你将模块的方法作为实例方法“引入”

例:

 module A
def say
puts "this is module A"
end
end


class B
include A
end


class C
extend A
end
< p > B.say =>未定义的方法'说' B:类

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

< p > C.say =>这是模块A

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

你有没有试过require一个模块?结果如何?试试:

MyModule = Module.new
require MyModule # see what happens

模块不是必需的,只是包含的!

编程Ruby 1.9

在继续之前,我们要讲几点关于include语句的内容。首先,它有 与文件无关。C程序员使用一个名为#include to的预处理器指令 在编译期间将一个文件的内容插入到另一个文件中。Ruby的include语句 简单地引用一个模块。如果该模块位于单独的文件中,则必须使用 Require(或其不太常用的表亲load)在使用include之前将该文件拖进来。 其次,Ruby include并不是简单地将模块的实例方法复制到类中。 相反,它从类引用到包含的模块。如果有多个类 包括那个模块,它们都指向同一个东西。如果你改变a的定义 方法,即使在程序运行时,所有包含该方法的类 模块将显示新的行为
< p >包括 如下所示,当你将一个模块包含到你的类中时,就好像你将模块中定义的代码插入到类中,在那里你“包含”了它。它允许' mixin '行为。它用于DRY你的代码以避免重复,例如,如果在模块中有多个类需要相同的代码 < p >加载 load方法几乎类似于require方法,除了它不跟踪库是否已加载。因此,可以多次加载一个库,而且在使用load方法时,必须指定“。

. Rb "库文件的扩展名 < p >要求 require方法允许您加载一个库,并防止它被多次加载。如果你尝试在第一次之后加载相同的库,require方法将返回' false '。require方法只需要在你正在加载的库定义在一个单独的文件中,通常情况下才需要使用

你可以选择这个 http://ionrails.com/2009/09/19/ruby_require-vs-load-vs-include-vs-extend/ < / p >

require(name)

它将返回bolean true/false

作为参数传递给require的名称,ruby将尝试在您的加载路径中找到该名称的源文件。 如果你尝试在第一次之后加载相同的库,require方法将返回' false '。require方法仅在您正在加载的库定义在单独的文件中时才需要使用。 因此,它会跟踪该库是否已经加载

include module_name
假设你有一些方法,你需要在两个不同的类中。这样就不需要在两个类中都写了。相反,你可以在module中定义它。然后将此模块包含在其他类中。 它是由Ruby提供的,只是为了保证DRY原则。它用来DRY你的代码,以避免重复

下面是require和include之间的一些基本区别:

要求:

  1. Require从文件系统读取文件,解析它,保存到内存中,并在给定的位置运行它,这意味着如果你在脚本运行时更改了任何内容,那么这些更改将不会反映出来。
  2. 我们按名称要求文件,而不是按模块名。
  3. 它通常用于库和扩展。

包括:

  1. 当你将一个模块包含到你的类中时,它的行为就像你将模块中定义的代码插入到你的类中一样。
  2. 我们包含模块名,而不是文件名。
  3. 它通常用于干涸代码和删除代码中的重复。

'Load'-插入文件内容。(每次调用文件时解析文件)

'Require'-插入一个文件解析的内容。(文件解析一次,存储在内存中)

'Include'-将模块包含到类中,并可以使用模块内的方法作为类的实例方法

'Extend'-将模块包含到类中,并可以使用模块内的方法作为类方法