20

有没有办法在内存中“重新加载”或“刷新”rubygem?当我在玩 irb 时,偶尔我喜欢修改我的 gem 文件,如果我需要相同的 gem,它不会更新到内存中并给出输出“false”。目前我必须退出 IRB,回到 IRB,然后再次需要 gem,必须有更好的方法......它是什么?

4

3 回答 3

18

正如其他人所建议的,您可以使用 Kernel#load。但是,不要浪费时间查找和加载每个 gem 文件,因为所有需要的文件都存储在 $" 中。有了这些知识,这里有一个 reload irb 命令:

 def reload(require_regex)
  $".grep(/^#{require_regex}/).each {|e| load(e) }
 end

例如,如果您在 irb 中使用 hirb gem,您只需重新加载:

>> reload 'hirb'

如果由于某种原因 load 不起作用(文件扩展名比 require 更挑剔),您可以通过首先删除 $" 中的条目来重新请求任何文件。有了这个建议,上面的命令将是:

 def reload(require_regex)
   $".grep(/^#{require_regex}/).each {|e| $".delete(e) && require(e) }
 end

选择适合您的。就个人而言,我使用后者。

于 2010-08-12T07:38:18.870 回答
8

加载“文件名.rb”

每次更改一个...

于 2010-08-11T22:01:25.143 回答
6

一种方法是使用Kernel#load. 你可以像使用它一样使用它Kernel#require,除了你必须明确地包含文件扩展名。然而,它有它的缺点(即使是简单的class Foo < Struct.new(:foo); end失败,因为不可能改变一个类的超类),所以我也想知道一个更好的方法来做到这一点。

在 Rails 中,您可以reload!在脚本/控制台上实现这一点,但我不知道他们使用了什么样的魔法。

这个要点看起来很有希望,但我还没有测试过。

于 2010-08-11T22:34:07.377 回答