如何要求第二次

Posted

技术标签:

【中文标题】如何要求第二次【英文标题】:How to require for the second time 【发布时间】:2012-05-05 13:26:36 【问题描述】:

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

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

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

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

【问题讨论】:

IRB 是您唯一的选择吗?可以用pry吗? 【参考方案1】:

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

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

【讨论】:

我知道是否有“.rb”的区别,但不知怎么的,我没有意识到路径。【参考方案2】:
:000> path = "extremely/long/path/to/my/file"
:001> load path
:002> load path

【讨论】:

【参考方案3】:

您可以自己编写并将其放入您的 .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 名称相关的路径。 颤抖

【讨论】:

我已经编辑了答案以包含一个利用现有 require 魔法的更简单的版本。 感谢您的帮助。实际上,我的问题可能很愚蠢。正如 steenslag 回答的那样,我可能根本不必担心路径。但你的代码会很有用。

以上是关于如何要求第二次的主要内容,如果未能解决你的问题,请参考以下文章

第二次作业

第二次作业

第二次结对编程-字词短语统计

为啥 Chrome 有时会要求第二次进行基本身份验证,而 Firefox 则不会?

第二次程序+PSP0级

信号与系统 2023(春季) 作业要求 - 第二次作业