【问题标题】:When to use `require`, `load` or `autoload` in Ruby?何时在 Ruby 中使用 `require`、`load` 或 `autoload`?
【发布时间】:2009-04-29 21:12:38
【问题描述】:

我了解 Ruby 中 requireloadautoload 之间的细微差别,但我的问题是,您怎么知道该使用哪一个?

除了能够在匿名模块中“包装”load 之外,require 似乎是首选。

但是autoload 允许你延迟加载文件——这听起来很棒,但我不确定你实际上比require 获得了什么

一种方法优于另一种方法吗?是否存在一种方法脱颖而出的情况?

【问题讨论】:

    标签: ruby module


    【解决方案1】:

    一般情况下,您应该使用requireload 每次都会重新加载代码,所以如果你从几个模块中加载,你会做很多额外的工作。 autoload 的懒惰在理论上听起来不错,但是许多 Ruby 模块会做猴子修补其他类之类的事情,这意味着程序中不相关部分的行为可能取决于给定类是否已被使用。

    如果您想创建自己的自动重新加载器,在每次代码更改或每次有人点击 URL 时加载您的代码(出于开发目的,因此您不必每次都重新启动服务器),然后使用 load因为这是合理的。

    【讨论】:

    【解决方案2】:

    除了别人已经告诉你的,autoload 的未来是不确定的。它计划在 Ruby 2.0 中被弃用,但在 2.0 功能冻结时没有及时弃用。现在预计 autoload 将在 Ruby 2.1 中被弃用,but that is not even certain anymore

    【讨论】:

    【解决方案3】:

    autoloadrequire 获得的收益如下:

    autoload 主要用于加快 Ruby 程序或 Rails 应用程序的初始化阶段。通过在需要资源之前不加载资源,它可以大大加快速度。

    另一个优点是,如果用户不使用某些功能,您可能不需要加载代码的某些部分,从而缩短加载时间并减少内存占用。

    【讨论】:

      【解决方案4】:

      mylibrary.rb

      puts "I was loaded!"
      
      class MyLibrary
      end
      

      试试 irb

      irb(main):001:0> require 'mylibrary'
      I was loaded!
      => true
      
      irb(main):001:0> autoload :MyLibrary, 'mylibrary'
      => nil
      irb(main):002:0> MyLibrary.new
      I was loaded!
      => #<MyLibrary:0x0b1jef>
      

      看看区别。

      【讨论】:

      • 提问者知道 require 和 autoload 之间的区别,他问的是什么时候应该使用一个而不是另一个。
      • 感谢安德鲁指出。你说的对。正如上面 user979339 所提到的 ..autoload 应该在时间很紧迫但您仍想加快进程的情况下使用。例如在像“瘦”这样的应用服务器中。如果你看一下thin的源代码,你会发现作者使用autoload而不是require来加载thin的核心部分,如命令、连接和日志记录,这加速了thin的初始化。
      • 你必须小心那些没有用 Ruby stdlib 和 ruby​​gems 注册的库,所以需要 './filename-no ext' 作为本地库的示例。也许你可以在你的代码中解决这个问题,然后删除我的评论?但是感谢这个简单的例子。但是“加载”呢?
      猜你喜欢
      • 2011-08-29
      • 2011-03-11
      • 2019-10-11
      • 2013-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多