499

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

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

4

11 回答 11

571

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

回答:

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

require 方法做了大多数其他编程语言中 include 所做的事情:运行另一个文件。它还会跟踪您过去需要的内容,并且不会两次需要相同的文件。要在没有此附加功能的情况下运行另一个文件,您可以使用 load 方法。

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

来源

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

奇怪的是,Ruby'srequire类似于 C's include,而 Ruby'sinclude几乎与 C's 完全不同include

于 2008-11-25T17:19:28.863 回答
119

如果您使用的是模块,这意味着您将所有方法都带入您的类。如果您extend是带有模块的类,则意味着您将模块的方法作为方法“引入”。如果你include是一个带有模块的类,这意味着你正在“引入”模块的方法作为实例方法。

前任:

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

 class B
   include A
 end

 class C
   extend A
 end

B.say => B:Class 的未定义方法“说”

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

C.say => 这是模块 A

C.new.say => C:Class 的未定义方法“说”

于 2013-01-08T09:38:22.707 回答
100

来自元编程 Ruby 书,

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

于 2011-05-21T15:44:07.630 回答
62

这里有一个很好的解释:

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

"require"类似于 C 的 include,可能会导致新手混淆。(一个显着的区别是,当要求完成时,要求文件中的本地人“蒸发”。)

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

重点补充。

于 2008-11-25T17:21:27.843 回答
8

编程 Ruby 1.9

在继续之前,我们将对 include 语句提出几点意见。首先,它与文件无关。C 程序员使用称为#include 的预处理器指令在编译期间将一个文件的内容插入到另一个文件中。Ruby 的 include 语句只是对模块进行引用。如果该模块位于单独的文件中,则必须在使用 include 之前使用 require(或其不太常用的表亲 load)将该文件拖入。其次,Ruby 包含不会简单地将模块的实例方法复制到类中。相反,它从类中引用包含的模块。如果多个类包含该模块,它们都将指向同一事物。如果您更改模块中方法的定义,即使您的程序正在运行,

于 2014-08-25T01:48:46.360 回答
7

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

MyModule = Module.new
require MyModule # see what happens

模块不是必需的,只有包括在内!

于 2013-06-12T03:29:38.457 回答
4

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

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

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

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

于 2020-01-12T22:20:52.187 回答
3

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

Load load 方法与 require 方法几乎一样,只是它不跟踪该库是否已加载。因此可以多次加载一个库,并且在使用加载方法时,您必须指定库文件名的“.rb”扩展名。

Require require 方法允许您加载一个库并防止它被多次加载。如果您在第一次之后尝试加载同一个库,require 方法将返回“false”。仅当您正在加载的库在单独的文件中定义时才需要使用 require 方法,通常是这种情况。

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

于 2014-11-27T10:16:21.447 回答
3

包括

当您include将模块添加到您的类中时,就好像您将模块中定义的代码插入到类中,并在其中“包含”它。它允许“混合”行为。它用于干燥您的代码以避免重复,例如,如果模块中有多个类需要相同的代码。

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”。仅当您正在加载的库在单独的文件中定义时才需要使用 require 方法,通常是这种情况。

因此它会跟踪该库是否已经加载。您也不需要指定库文件名的“.rb”扩展名。下面是一个如何使用 require 的示例。将 require 方法放在“.rb”文件的最顶部:

加载

load 方法几乎类似于 require 方法,只是它不跟踪该库是否已加载。因此可以多次加载一个库,并且在使用加载方法时,您必须指定库文件名的“.rb”扩展名。

延长

当使用扩展方法而不是包含时,您将模块的方法添加为类方法而不是实例方法。

module Log 
  def class_type
    "This class is of type: #{self.class}"
  end
end

class TestClass 
  extend Log 
  # ... 
end

tc = TestClass.class_type
于 2017-11-17T19:15:56.920 回答
3

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

要求:

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

包括:

  1. 当您将模块包含到您的类中时,它的行为就像您将模块中定义的代码插入到您的类中一样。
  2. 我们包括模块名称,而不是文件名。
  3. 它通常用于干涸代码并删除代码中的重复项。
于 2018-02-28T20:54:45.060 回答
2
require(name)

它将返回布尔真/假

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

include module_name

假设您有一些方法需要在两个不同的类中使用。然后,您不必在两个类中都编写它们。相反,您可以做的是在模块中定义它。然后将此模块包含在其他类中。Ruby 提供它只是为了保证 DRY 原则。它用于干燥您的代码以避免重复

于 2016-01-04T13:36:13.363 回答