第二次如何要求

问题描述:

有没有办法强制require - 文件第二次?第二次如何要求

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

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

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

+0

IRB是你唯一的选择吗?你可以用'撬'吗? – 2013-12-21 23:52:13

load不需要(hmm)完整路径。它期望一个完整的文件名和扩展名。

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

我知道是否有“.rb”之间的区别,但我不知道有关路径。 – sawa 2012-04-25 02:20:30

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

你可以写你自己的,并把它放在你的.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阵列,并将所有看起来与该宝石名称相关的路径取出。 不寒而栗

+0

我已经编辑了答案,包括利用现有的需要魔法的更简单的版本。 – Phrogz 2012-04-24 22:44:52

+0

感谢您的帮助。其实,我的问题可能很愚蠢。随着史蒂文拉格的回答,我可能不必担心这条路。但是你的代码会很有用。 – sawa 2012-04-25 02:19:30