Ruby-如何使用IRB或PRY的更改重新加载文件?

时间:2019-05-13 12:48:12

标签: ruby irb pry

我进入irb并需要一个文件

irb> require_relative 'prime'
irb> true

此文件包含以下代码:

def is_prime? num
  (2..num-1).each do |div_by|
    if num % div_by == 0
      return false
    end 
  end 
  true
end

在irb中需要文件,我可以使用例如方法

irb> require_relative 'prime'
irb> is_prime? 10
irb> -> false

irb> is_prime? 11
irb> -> true

但是,如果我修改源文件,说添加puts 'HHH',除非退出控制台并重新输入然后require,否则该文件不会显示

如果我留在控制台中并再次要求该文件,我将得到错误的消息,因为该文件已经加载并且没有得到新的更改

我尝试过

irb> reload

irb> reload!

但他们给了我

NoMethodError (undefined method `reload!' for main:Object)

我也尝试过

irb> load 'prime.rb'
irb> => true

但没有领取更改

使用PRY得出相似的结果

3 个答案:

答案 0 :(得分:3)

尝试Kernel#load,并提供相对于rb文件的相对路径:

irb> load './path/to/prime.rb'

Kernel#require仅加载一次源文件,而Kernel#load每次调用时加载一次。

参考https://stackoverflow.com/a/4633535/4950680

答案 1 :(得分:3)

require只是说您从字面上“要求”要加载的其他.rb文件。加载后,将满足该要求,并且将忽略具有相同目标文件的其他require调用。这样可以省去在许多源文件中随意散布相同的require调用-在执行第一个文件之后它们实际上不会执行任何操作。

您可以使用load来强制它实际加载文件-这应该完全符合您的预期(require在检查是否已需要文件后调用load)。

请注意,如果您处于普通的红宝石环境中(即自己调用方法或实例化对象),那么所有这些操作都非常简单,但是如果涉及到“大手枪”又称Rails,则可能会变得有些毛茸茸。 Rails在幕后做了很多魔术,以自动要求缺少内容(因此,为什么您在Rails代码中看到很少的显式require调用)-这导致load中的显式irb有时看似没有效果。

答案 2 :(得分:0)

使用 PRY:

就我而言,load 返回 true,使用 $ MyClass.method 我可以看到新的源代码,但该方法仍在执行旧代码。

我按照建议使用 reset 命令(仅限 pry)解决了 here