我的问题类似于“What is the difference between include and extend in Ruby?”。
Ruby中require
和include
之间有什么区别?如果我只想使用我班级模块中的方法,我应该require
还是include
呢?
答案 0 :(得分:528)
有什么区别 Ruby中的“include”和“require”?
<强>答案:强>
include和require方法可以 非常不同的事情。
require方法做的包括 在大多数其他编程中 语言:运行另一个文件。它也是 跟踪你需要的东西 过去并不会要求相同的文件 两次。不用运行另一个文件 这个增加的功能,你可以使用 负载方法。
include方法占用全部 另一个模块的方法和 将它们包含在当前模块中。 这是一个语言级别的东西 与文件级别的东西相反 要求。 include方法是 使用“扩展”类的主要方法 其他模块(通常称为 混合插件)。例如,如果你的班级 你可以定义方法“each” 包括mixin模块Enumerable 它可以作为一个集合。这个 可能会混淆为包含动词 在其他方面使用非常不同 语言。
因此,如果您只是想使用模块,而不是扩展它或进行混合,那么您将需要使用require
。
奇怪的是,Ruby的require
类似于C的include
,而Ruby的include
几乎与C的include
完全不同。
答案 1 :(得分:88)
来自Metaprogramming Ruby书,
require()
方法与load()
非常相似,但它的意思是 不同的目的。您使用load()
来执行代码,并使用require()
导入库。
答案 2 :(得分:88)
如果您正在使用模块,那意味着您将所有方法带入您的课程。
如果你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
=&GT;未定义的方法'说'为B:Class
B.new.say
=&GT;这是模块A
C.say
=&GT;这是模块A
C.new.say
=&GT;未定义的方法'说'代表C:Class
答案 3 :(得分:55)
Ruby require
更像是“include”在其他语言中(例如C)。它告诉Ruby你想要 引入另一个文件的内容 。其他语言中的类似机制是:
Ruby include
是一个 面向对象的继承机制,用于mixins 。
有一个很好的解释here:
[简单的回答]要求和包含基本上是无关的。
“require”类似于C include,这可能会导致新手混淆。 (一个值得注意的区别是所需文件中的本地人“蒸发” 当要求完成时。)
Ruby include 与C include完全不同。 include语句将模块“混入”到类中。这是一种 限制形式 多重继承 。包含的模块字面上给出了“is-a” 对包括它在内的事物的关系。
强调补充。
答案 4 :(得分:7)
你有没有试过require
一个模块?结果是什么?试试吧:
MyModule = Module.new
require MyModule # see what happens
模块不是必需的,只包括在内!
答案 5 :(得分:7)
来自编程Ruby 1.9
在我们继续之前,我们会对include语句提出几点意见。首先,它有 与文件无关。 C程序员使用名为#include的预处理程序指令 在编译期间将一个文件的内容插入另一个文件。 Ruby include语句 只是引用一个模块。如果该模块位于单独的文件中,则必须使用 在使用include之前,要求(或不太常用的表兄,加载)拖动该文件。 其次,Ruby include不会简单地将模块的实例方法复制到类中。 相反,它从类到引用模块的引用。如果有多个班级 包括那个模块,他们都指向同一个东西。如果更改了a的定义 模块中的方法,即使在程序运行时,包含该方法的所有类 模块将展示新行为。
答案 6 :(得分:3)
包含 当您将一个模块包含到您的类中时,如下所示,就好像您使用了模块中定义的代码并将其插入到类中,您可以在其中包含它。它允许'mixin'行为。它用于干扰代码以避免重复,例如,如果有多个类需要模块中的相同代码。
负载 load方法几乎与require方法类似,不同之处在于它不会跟踪是否已加载该库。因此可以多次加载库,并且在使用加载方法时,必须指定库文件名的“.rb”扩展名。
需要 require方法允许您加载库并防止它被多次加载。如果您尝试在第一次之后加载相同的库,则require方法将返回'false'。只有在加载的库是在单独的文件中定义时才需要使用require方法,通常就是这种情况。
你可以选择这个 http://ionrails.com/2009/09/19/ruby_require-vs-load-vs-include-vs-extend/
答案 7 :(得分:3)
“加载”-插入文件的内容。(每次调用文件时解析文件)
'Require'-插入文件解析的内容。(文件解析一次并存储在内存中)
'Include'-将模块包含在类中,并且可以将模块内部的方法用作类的实例方法
“扩展”-将模块包含在类中,并且可以将模块内部的方法用作类方法
答案 8 :(得分:2)
require(name)
它将返回bolean true / false
作为参数传递给require的名称,ruby将尝试在加载路径中查找具有该名称的源文件。 如果您尝试在第一次之后加载相同的库,则require方法将返回'false'。如果要加载的库是在单独的文件中定义的,则只需要使用require方法。 因此,它会跟踪该库是否已加载。
include module_name
假设您有两个不同类需要的方法。然后你不必在两个课程中都写它们。相反,你可以做的是,在模块中定义它。然后将此模块包含在其他类中。 它由Ruby提供,以确保DRY原则。它用于干扰您的代码以避免重复
答案 9 :(得分:1)
包含强>
当你
include
一个模块进入你的班级时,就像你拿走了 在模块中定义的代码并将其插入到类中,其中 你'包括'它。它允许'mixin'行为。它习惯了干涸 你的代码,以避免重复,例如,如果有多个 在模块中需要相同代码的类。
module Log
def class_type
"This class is of type: #{self.class}"
end
end
class TestClass
include Log
# ...
end
tc = TestClass.new.class_type # -> success
tc = TestClass.class_type # -> error
<强>需要强>
require方法允许您加载库并阻止它 被装载不止一次。如果,require方法将返回'false' 您尝试在第一次之后加载相同的库。要求 只有在您加载的库中定义时才需要使用方法 一个单独的文件,通常就是这种情况。
因此它会跟踪该库是否已加载。您也不需要指定库文件名的“.rb”扩展名。 这是一个如何使用require的示例。将require方法放在“.rb”文件的最顶部:
<强>加载强>
load方法几乎与require方法类似,但它没有 跟踪该库是否已加载。所以这是 可以多次加载库以及使用加载时 方法必须指定库文件名的“.rb”扩展名。
<强>扩展强>
使用extend方法而不是include时,您要添加 模块的方法作为类方法而不是实例方法。
module Log
def class_type
"This class is of type: #{self.class}"
end
end
class TestClass
extend Log
# ...
end
tc = TestClass.class_type
答案 10 :(得分:1)
以下是require和include之间的一些基本差异:
需要:
包括:
答案 11 :(得分:-1)
在回答这个问题之前,我将向您简要介绍为什么我们在PHP中使用include()和require()。
在服务器执行之前,将一个PHP文件的内容插入另一个PHP文件。现在,有关include()
和require()
的更多细节。
include()-它包含一个指定的文件。如果找不到文件并执行其余脚本,它将产生警告。 include()不需要文件时应使用,而找不到文件时应继续应用程序流。
语法-
包括“文件名”;
我们可以使用include()
来代替include_once()
include_once()-它还包含指定的文件,但是如果已经包含文件。它将不再包含在内。如果找不到文件并执行其余脚本,它还将发出警告。
语法-
include_once();
require()-它也包含一个指定的文件,但是如果找不到该文件并停止执行,它将引发致命错误(E_COMPILE_ERROR)。
语法
需要“文件名”;
我们可以使用require()
来代替require_once();
require_once()-它还包括一个指定的文件,但是如果已经包含一个文件。它将不再包含在内。如果找不到文件并停止执行,它将引发致命错误(E_COMPILE_ERROR
)。
语法
require_once();