`
clark1231
  • 浏览: 256491 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Ruby Require vs Load vs Include vs Extend

    博客分类:
  • ruby
阅读更多

 load

load用来多次加载一个库,你必须指定扩展名。

 

load的使用方法几乎和require一样,但它不会跟踪是否已经加载该库。当你使用一个load方法时,你必须制定“.rb”(扩展库文件名)来加载库,当然它可以多次加载一个库。

 

很多时候,当你想要用require而不是load,但如果你想每次库调用库都被重新加载那么就使用load。比如,如果你的module经常改变,你或许想使用load去将这些改变加载到class中。

 

load 'test_library.rb'

如果模块被定义在一个单独的.rb文件,那么你可以这么使用:

 

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

  

load 'log.rb'

class TestClass
  include Log
  # ... 
end

 

require

require方法让你加载一个库,并防止它被多次加载。如果您尝试多次加载同一个库,require方法将返回“false”。只有当你要加载的库位于一个分离的文件中时才有必要使用require。使用时不需要加扩展名,一般放在文件的最前面.

 

它可以跟踪该库是否已经加载与否。你也不必指定“.rb”扩展名的库文件名。

 

require 'test_library'

 

include

当你将module加载(include)进class中,正如如下代码所示,你就可以使用定义在module中的函数并且将其插入到该class中。它也允许‘mixin’行为。这是用来DRY你的代码,以避免重复,例如,如果有多个类,只需要将同样的代码放在模块内。

 

下面的代码是将设module Log和class TestClass定义在同一个.rb文件中。如果他们分别在独自的单独文件中的话,就需要使用‘load’和‘require’来让class你已经定义的module。

 

当你的库加载之后,你可以在你的类定义中包含一个module,让module的实例方法和变量成为类本身的实例方法和类变量,它们mix进来了。根据锄头书,include并不会把module的实例方法拷贝到类中,只是做了引用,包含module的不同类都指向了同一个对象。如果你改变了module的定义,即使你的程序还在运行,所有包含module的类都会改变行为。

 

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

class TestClass
  include Log
  # ...
end
tc = TestClass.new.class_type
#The above will print “This class is of type: TestClass”

extend

当使用method方法而不是include的时,你可以将method方法作为一个类方法而不是实例方法。

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

class TestClass
  extend Log
  # ... 
end

tc = TestClass.class_type
#The above will print “This class is of type: TestClass”

 当在类中使用extend而不是include,如果你尝试实例化TestClass,并在该类中调用class_type方法时,像你在上面的include的例子中一样,你会得到一个NoMethodError。该模块的方法成为类方法。

参考:http://ionrails.com/2009/09/19/ruby_require-vs-load-vs-include-vs-extend/

 

分享到:
评论

相关推荐

    Ruby中require、load、include、extend的区别介绍

    ### Ruby中require、load、include、extend的区别介绍 在Ruby编程语言中,为了实现代码的重用和组织,开发者经常需要引入外部文件或模块。在这一过程中,`require`、`load`、`include`、`extend`这几个关键字发挥了...

    动态加载的艺术:Ruby中require与load的区别

    ### 动态加载的艺术:深入理解 Ruby 中 `require` 与 `load` 的区别 #### 引言 在 Ruby 编程中,模块化和代码重用是非常重要的实践。为了实现这一目标,Ruby 提供了两种不同的方法来加载外部文件和库:`require` ...

    include和require的区别

    首先,`require`和`include`在处理文件不存在或加载失败时的反应不同。当使用`require`尝试引入一个不存在的文件时,PHP会抛出一个致命错误(Fatal Error),并停止脚本的执行。这意味着如果`require`的文件未找到或...

    Ruby,详细描述require背后的故事

    `require`背后的机制涉及到了Ruby的加载路径(`$LOAD_PATH`),这是一个Ruby用来搜索文件或库的目录列表。 #### `require`与`require_relative` 在Ruby中,除了`require`之外,还有一个`require_relative`关键字。这...

    举例讲解Ruby中require的使用方法

    - 当使用`require`时,Ruby解释器会根据`$LOAD_PATH`环境变量中的路径来查找指定的文件。 - `$LOAD_PATH`是一个数组,包含了Ruby解释器搜索库文件的所有路径。 - 如果文件不在`$LOAD_PATH`中,则Ruby会抛出一个...

    深入理解require与require_once与include以及include_once的区别

    在PHP编程中,`require`、`require_once`、`include`和`include_once`都是用于引入其他PHP文件的关键函数,它们有助于实现代码重用和模块化编程。这些函数之间的主要区别在于它们处理重复导入的方式。 1. `require...

    require(),include(),require_once()和include_once()区别

    在选择使用 `require()` 还是 `include()` 时,通常推荐使用 `require()` 当你确信文件必须存在且需要在程序开始时加载,而 `include()` 则更灵活,适用于可选的文件包含或者在条件语句中。对于 `require_once()` 和...

    require(),include(),require_once()和include_once()的异同

    `require_once()` 和 `include_once()` 分别是 `require()` 和 `include()` 的变体,它们的区别在于,这两个函数会检查文件是否已经被包含过。如果文件已经被包含,那么它们就不会再次执行包含操作。这是防止重复...

    Ruby 连接数据库资源汇总

    Ruby 是一种动态、开源的编程语言,以其简洁和表达力强的特点受到开发者的喜爱。在IT行业中,数据库连接是常见的任务,无论是在Web应用开发还是数据处理中。Ruby 提供了多种方式来连接不同的数据库系统,如 MySQL、...

    ruby example webrick

    ruby sample: @echo off cd D:\proj\demo rem previously drop tables call rake db:migrate VERSION=0 rem load test data (it depends on the db:environment and db:migrate tasks) call rake db:load_test_...

    Ruby-dotenv从env加载环境变量

    require 'dotenv/load' # 这行代码会在运行时加载.env文件 puts ENV['DATABASE_URL'] # 输出:mysql://user:password@localhost/mydatabase puts ENV['API_KEY'] # 输出:your_secret_api_key ``` dotenv gem提供了...

    【跳坑日记】Ubuntu 16.04安装 Ruby2.7.0遇到的坑:cannot load such file — openssl (LoadError)

    在本文中,我们将探讨在Ubuntu 16.04系统上安装Ruby 2.7.0时遇到的一个常见问题:`cannot load such file — openssl (LoadError)`。这是一个与Ruby和OpenSSL库集成有关的问题,通常发生在试图安装或运行依赖于...

    ruby使用json库

    在Ruby中,可以使用`require 'json'`引入JSON库。然后,`JSON.parse`方法可以将JSON字符串转化为Ruby的数据结构,如哈希或数组。例如: ```ruby require 'json' json_string = '{"name":"John", "age":30, "city...

    Ruby/tk学习资料

    如果希望强制重新加载这些资源,可以使用`load`命令。 #### 6. 执行脚本 文档建议,从交互式模式(irb)运行程序可能不是最佳选择,而是应该直接运行Ruby脚本。下面是一个简单的脚本示例: ```ruby require 'tk' ...

    ruby测试代码1

    在Ruby编程语言中,测试代码扮演着至关重要的角色,它确保了代码的质量和可靠性。"ruby测试代码1"可能指的是一个具体的测试用例或者测试框架的实例,用于验证Ruby程序的功能和性能。Ruby提供了多种测试工具,如...

    PHP包含文件函数include、include_once、require、require_once区别总结

    include() 、require()语句包含并运行指定文件。这两结构在包含文件上完全一样,唯一的区别是对于错误的处理。require()语句在遇到包含文件不存在,或是出错的时候,就停止即行,并报错。include()则继续即行。

Global site tag (gtag.js) - Google Analytics