Ruby中include和require有什么区别?

Owe*_*wen 458 ruby require include

我的问题类似于" Ruby中包含和扩展之间有什么区别? ".

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

Han*_*nto 540

Ruby中"include"和"require"之间有什么区别?

回答:

include和require方法做了很多不同的事情.

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

include方法从另一个模块获取所有方法,并将它们包含在当前模块中.这是一种语言级别的东西,而不是像require那样的文件级别的东西.include方法是与其他模块"扩展"类的主要方法(通常称为混合).例如,如果您的类定义方法"each",则可以包含mixin模块Enumerable,它可以充当集合.这可能令人困惑,因为包含动词在其他语言中的使用方式非常不同.

资源

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

奇怪的require是,Ruby's 类似于C's include,而Ruby's include几乎就像C's include.

  • 实际上C包括,不按需要加载文件,而是用文件内容替换#include行.包含的文件不必是"标题",#include不必位于文件的开头,但可以在任何地方,如类或甚至方法定义.这意味着您可以通过在文件中写入一些方法并将其包含在类的代码中来完成C++中的mixin,您可以在ruby中完成.所以他们并没有那么远,尽管它确实不是C的常见做法. (44认同)
  • 这个答案可以通过包含示例而受益. (13认同)
  • mb14的评论意味着这一点,但它明确地说明:与答案所说的相反,要求不要**"运行"一个文件,而是将其加载,就好像它是包含文件的一部分一样.这似乎是语义上的挑剔,但实际上它是一个相当重要的区别. (12认同)

小智 93

如果您正在使用模块,那意味着您将所有方法带入您的课程.如果你extend是一个带有模块的类,那意味着你将模块的方法作为方法"引入" .如果你include是一个带有模块的类,那意味着你将模块的方法作为实例方法"引入" .

EX:

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

 class B
   include A
 end

 class C
   extend A
 end
Run Code Online (Sandbox Code Playgroud)

B.say =>未定义的方法'说'代表B:Class

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

C.say =>这是模块A.

C.new.say =>未定义的方法'说'代表C:Class

  • 我认为这不能回答这个问题,但这正是我所寻找的=) (22认同)
  • 这实际上并没有回答“ require”和“ include”之间的区别是什么的问题。 (2认同)

Pra*_*oya 91

从Metaprogramming Ruby书中,

require()方法非常相似load(),但它的目的不同.您load()用来执行代码,并 require()用于导入库.

  • 根本没有提及include()的投票. (84认同)
  • 请勿在答案中与其他语言进行比较:) (69认同)

bra*_*ntz 56

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

[简单的回答]要求和包含基本上是无关的.

"require"类似于C include,这可能会导致新手混淆.(一个值得注意的区别是,当需求完成时,所需文件中的本地人"蒸发".)

Ruby 包含与C包含的不同.include语句将模块"混入"到类中.它是多重继承有限形式.包含的模块在字面上赋予包含它的东西的"is-a"关系.

强调补充说.


小智 8

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

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

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

“扩展”- 将模块包含到类中,并且可以将模块内的方法用作类方法


Bor*_*cky 7

你有没有试过require一个模块?结果是什么?试一试:

MyModule = Module.new
require MyModule # see what happens
Run Code Online (Sandbox Code Playgroud)

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


ciz*_*ixs 7

来自Programming Ruby 1.9

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