在IRB重新加载rubygem

Sch*_*ems 20 ruby ruby-on-rails irb

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

cld*_*ker 17

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

 def reload(require_regex)
  $".grep(/^#{require_regex}/).each {|e| load(e) }
 end
Run Code Online (Sandbox Code Playgroud)

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

>> reload 'hirb'
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 它不,不.正则表达式限制太多 - 您必须指定完整路径.我修改了我的版本,用/替换^. (2认同)

rog*_*ack 8

加载'filename.rb'

每个被改变的一次一个...


slu*_*nen 6

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

在rails中你可以reload!通过脚本/控制台来实现这一点,但我不知道他们使用了什么样的魔法.

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