Ruby中include和require有什么区别?

时间:2008-11-25 17:12:31

标签: ruby include require

我的问题类似于“What is the difference between include and extend in Ruby?”。

Ruby中requireinclude之间有什么区别?如果我只想使用我班级模块中的方法,我应该require还是include呢?

12 个答案:

答案 0 :(得分:528)

  

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

     

<强>答案:

     

include和require方法可以   非常不同的事情。

     

require方法做的包括   在大多数其他编程中   语言:运行另一个文件。它也是   跟踪你需要的东西   过去并不会要求相同的文件   两次。不用运行另一个文件   这个增加的功能,你可以使用   负载方法。

     

include方法占用全部   另一个模块的方法和   将它们包含在当前模块中。   这是一个语言级别的东西   与文件级别的东西相反   要求。 include方法是   使用“扩展”类的主要方法   其他模块(通常称为   混合插件)。例如,如果你的班级   你可以定义方法“each”   包括mixin模块Enumerable   它可以作为一个集合。这个   可能会混淆为包含动词   在其他方面使用非常不同   语言。

Source

因此,如果您只是想使用模块,而不是扩展它或进行混合,那么您将需要使用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之间的一些基本差异:

需要:

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

    1. 当您在课程中包含一个模块时,它的行为就像您使用了模块中定义的代码并将其插入到您的课程中一样。
    2. 我们包含模块名称,而不是文件名。
    3. 它通常用于干燥代码并删除代码中的重复。

答案 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();