代码之家  ›  专栏  ›  技术社区  ›  Owen

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

  •  439
  • Owen  · 技术社区  · 17 年前

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

    有什么区别吗 require 和 include 红宝石?如果我只想使用类中某个模块的方法,我应该 要求 它还是 包括 是吗?

    11 回复  |  直到 7 年前
        1
  •  518
  •   stkent    9 年前

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

    答:

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

    Require方法包括 在大多数其他程序中 语言:运行另一个文件。它也 跟踪您在 过去不需要相同的文件 两次。运行另一个文件 这个附加的功能,您可以使用 加载方法。

    include方法将 来自另一个模块的方法和 将它们包含到当前模块中。 这是一个语言层面的事情 而不是文件级的东西 要求。include方法是 “扩展”类的主要方法 其他模块(通常称为 混合INS)。例如,如果您的类 定义方法“每个”,您可以 包括可枚举的mixin模块 它可以作为一个集合。这个 可能会混淆为include动词 在其他方面使用非常不同 语言。

    Source

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

    奇怪的是,鲁比的 要求 类似于C include 而露比的 包括 几乎没有什么像C的 包括 .

        2
  •  88
  •   Jonathan Fretheim Peter Toft    14 年前

    从元编程Ruby手册,

    这个 require() 方法与 load() 但它的意思是 另一个目的。你用 加载() 执行代码,然后使用 要求() 导入库。

        3
  •  84
  •   Andrei    13 年前

    如果您使用的是一个模块,这意味着您将把所有方法引入到您的类中。 如果你 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的未定义方法'say'

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

    C.say =>这是模块A

    C.new.say =>c:class的未定义方法'say'

        4
  •  55
  •   Community Mohan Dere    9 年前

    有一个很好的解释 here :

    [简单的答案]要求和包括基本上是不相关的。

    “需要” 类似于c include,这可能导致新手混淆。 (一个显著的区别是所需文件“蒸发”中的局部变量 当要求完成时。)

    红宝石 包括 与c include不同。include语句将模块“混入”到类中。这是一个 有限形式 多重继承 . 包含的模块字面上赋予“IS-A” 包括它在内的关系。

    强调添加。

        5
  •  7
  •   Boris Stitnicky    13 年前

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

    MyModule = Module.new
    require MyModule # see what happens
    

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

        6
  •  7
  •   cizixs    12 年前

    从 编程Ruby 1.9

    在继续之前,我们将对include语句提出几点看法。首先,它有 与文件无关。C程序员使用名为include to的预处理器指令 在编译期间将一个文件的内容插入另一个文件。ruby include语句 简单地引用一个模块。如果该模块位于单独的文件中,则必须使用 在使用include之前,需要(或其较不常用的表亲load)将该文件拖入。 其次,RubyInclude并不简单地将模块的实例方法复制到类中。 相反,它从类中引用包含的模块。如果多个类 包括那个模块,它们都指向同一件事。如果更改 方法在一个模块中,即使在程序运行时,所有包含该方法的类 模块将展示新的行为。

        7
  •  3
  •   Sanket    11 年前

    包括 当您将一个模块包含到您的类中时(如下所示),它就好像您获取了模块中定义的代码并将其插入到类中,在该类中,您将包含模块。它允许__mixin_行为。例如,如果模块中有多个类需要相同的代码,那么它用于擦干代码以避免重复。

    负载 加载方法与Require方法几乎相同,只是它不跟踪库是否已加载。因此,可以多次加载库,并且在使用加载方法时,必须指定库文件名的扩展名。

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

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

        8
  •  3
  •   Caleb Kleveter smit vashi    10 年前
    require(name)
    

    它将返回Bolean真/假

    作为参数传递给Require的名称,Ruby将尝试在加载路径中查找具有该名称的源文件。 如果第一次尝试加载同一个库,则Require方法将返回__false_。仅当正在加载的库在单独的文件中定义时,才需要使用Require方法。 所以它跟踪库是否已经加载。

    include module_name
    

    假设您有一些方法需要在两个不同的类中使用。那你就不必在两个班上都写了。相反,您可以在模块中定义它。然后将这个模块包含在其他类中。 它由Ruby提供,只是为了确保干燥。它用于擦干代码以避免重复

        9
  •  1
  •   Imran    8 年前

    包括

    当你 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的示例。将Require方法放在__.rb__文件的最上面:

    负载

    Load方法与Require方法几乎相同,只是它不具有 跟踪该库是否已加载。所以它是 可以多次加载库,也可以在使用加载时加载 方法必须指定库文件名的扩展名。

    延伸

    当使用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
  •  0
  •   Awais Shafqat    8 年前

    以下是需求和包括的基本区别:

    要求:

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

    包括:

    1. 当您在类中包含一个模块时,它的行为就好像您获取了模块中定义的代码并将其插入到类中一样。
    2. 我们包括模块名,而不是文件名。
    3. 它通常用于擦干代码并消除代码中的重复。
        11
  •  0
  •   Suraj Kumar zip    7 年前

    在回答这个问题之前,我将向您简要介绍为什么在PHP中使用include()和require()。

    将一个PHP文件的内容插入另一个PHP文件,然后服务器执行该文件。现在有更多关于 include() 和 require() .

    包含() -它包括一个指定的文件。如果找不到文件并执行其余的脚本,它将发出警告。 包含() 应在不需要该文件时使用,而在找不到该文件时应继续应用程序流。

    语法-

    包括_文件名_

    而不是使用 包含() 我们可以使用 include_once()

    包含() -它还包括一个指定的文件,但如果已经包含了一个文件。不会再包括在内。如果找不到文件并执行其余的脚本,也应发出警告。

    语法-

    包含();

    要求() -它还包括一个指定的文件,但如果找不到该文件并停止执行,它将抛出一个致命错误(e_compile_错误)。

    句法

    需要_文件名_

    而不是使用 要求() 我们可以使用 require_once();

    Read on on() -它还包括一个指定的文件,但如果已经包含了一个文件。不会再包括在内。它会抛出一个致命的错误( E_COMPILE_ERROR )如果找不到文件并停止执行。

    句法

    Read on on();

    推荐文章