如何第二次要求

时间:2012-04-24 20:57:17

标签: ruby load require

有没有办法第二次强制require - 文件?

我正在编写一个位于Ruby路径中的库。我正在编辑文件,同时在IRB中对它进行简单的测试。

每次我对文件进行更改时,我都希望在不结束IRB会话的情况下重新加载它。使用load需要每次都键入文件的整个路径,每次重新启动IRB都需要我键入简单测试所需的所有其他变量设置。

我只想要require这样的东西,但允许第二次加载。有一个简单的方法吗?

3 个答案:

答案 0 :(得分:27)

load不需要(嗯)完整路径。它需要一个带扩展名的完整文件名。

p load 'date.rb' #=> true
p load 'date.rb' #=> true
p load 'date'    #=> LoadError

答案 1 :(得分:4)

:000> path = "extremely/long/path/to/my/file"
:001> load path
:002> load path

答案 2 :(得分:4)

您可以自己编写并将其放入.irbrc:

新热度

module Kernel
  def reload(lib)
    if old = $LOADED_FEATURES.find{|path| path=~/#{Regexp.escape lib}(\.rb)?\z/ }
      load old
    else
      require lib
    end
  end
end

分钟 - 因此受到打击

module Kernel
  # Untested
  def reload(lib)
    if File.exist?(lib)
      load lib
    else
      lib = "#{lib}.rb" unless File.extname(lib)=='.rb'
      $:.each do |dir|
        path = File.join(dir,lib)
        return load(path) if File.exist?(path)
      end
    end
  end
end

对于旧版本的版本,如果你想支持RubyGems,你必须使其更加强大。

这些解决方案中的任何一个的一个问题是,虽然它会强制重新加载有问题的文件,但如果文件又调用其他人的require(通常是这样的话)宝石)这些文件不会重新加载。

解决这个问题真的很难看。比如,可能手动进入$LOADED_FEATURES数组并删除所有与gem名称相关的路径。 颤动