24

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

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

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

我只想要类似的东西,require但这允许第二次加载。有没有简单的方法来做到这一点?

4

3 回答 3

32

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

p load 'date.rb' #=> true
p load 'date.rb' #=> true
p load 'date'    #=> LoadError
于 2012-04-24T21:05:01.307 回答
4
:000> path = "extremely/long/path/to/my/file"
:001> load path
:002> load path
于 2012-04-24T21:01:20.247 回答
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其他文件(通常是 gems 的情况),这些文件将不会被重新加载。

解决这个问题真的很丑陋。就像,也许手动进入$LOADED_FEATURES数组并删除所有看起来与 gem 名称相关的路径。不寒而栗

于 2012-04-24T22:34:10.403 回答