在IRB重新加载rubygem

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

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

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

例如,如果您在irb中使用hirb gem,则只需使用以下命令重新加载:

 >> reload 'hirb' 

如果无论出于何种原因加载不起作用(文件扩展名比require要好),你可以通过首先在$“中删除它的条目来重新要求任何文件。通过这个建议,上面的命令将是:

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

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

加载’filename.rb’

每个被改变的一个一个…

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

在rails中,您可以通过reload!实现此目的reload! 在脚本/控制台上,但我不知道他们使用什么样的魔法。

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