我的问题类似于" Ruby中包含和扩展之间有什么区别? ".
Ruby require
和include
Ruby 之间的区别是什么?如果我只想使用我班级模块中的方法,我应该是require
它还是include
它?
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
.
如果您正在使用模块,那意味着您将所有方法带入您的课程.如果你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:Class
B.new.say
=>这是模块A.
C.say
=>这是模块A.
C.new.say
=>未定义的方法'说'代表C:Class
从Metaprogramming Ruby书中,
该
require()
方法非常相似load()
,但它的目的不同.您load()
用来执行代码,并require()
用于导入库.
Ruby require
更像是其他语言中的"include"(例如C).它告诉Ruby你要引入另一个文件的内容.其他语言的类似机制是:
using
C#中的指令.
import
在Java中.
Ruby include
是一种用于mixins的面向对象的继承机制.
这是一个很好的解释在这里:
[简单的回答]要求和包含基本上是无关的.
"require"类似于C include,这可能会导致新手混淆.(一个值得注意的区别是,当需求完成时,所需文件中的本地人"蒸发".)
Ruby 包含与C包含的不同.include语句将模块"混入"到类中.它是多重继承的有限形式.包含的模块在字面上赋予包含它的东西的"is-a"关系.
强调补充说.
你有没有试过require
一个模块?结果是什么?试一试:
MyModule = Module.new require MyModule # see what happens
模块不是必需的,只包括在内!
来自Programming Ruby 1.9
在我们继续之前,我们将对include语句提出几点意见.首先,它与文件无关.C程序员使用一个名为#include的预处理程序指令在编译期间将一个文件的内容插入到另一个文件中.Ruby include语句只是引用一个模块.如果该模块位于单独的文件中,则必须使用require(或其不太常用的表兄,load)在使用include之前拖动该文件.其次,Ruby include不会简单地将模块的实例方法复制到类中.相反,它从类到引用模块的引用.如果多个类包含该模块,则它们都指向相同的事物.如果更改模块中方法的定义,即使程序正在运行,包含该模块的所有类也将显示新行为.