include和require在Ruby中有什么区别?
我的问题类似于“ 在Ruby中包含和扩展有什么区别? ”。
在Ruby中require
和include
什么区别? 如果我只是想在我的课程中使用模块的方法,我应该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>
。
- 在C#中
-
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原则。 它被用来干你的代码,以避免重复