Ruby - 如何在IRB或PRY中重新加载带有更改的文件?

5

我进入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 文件,否则不会显示出来。

如果我留在控制台并再次 require 文件,我将得到假值,因为它已经被加载,我不会获得新的更改。

我已经尝试过:

irb> reload

并且

irb> reload!

但它们给了我

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

同时我尝试了

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

但是没有捕捉到更改

使用PRY得到了类似的结果

3个回答

9

加载 prime.rb 返回 true,但似乎没有捕捉到更改。 - Michael Durrant
请等待,它只能使用相对路径工作,例如加载 "./prime.rb",即使不使用文件路径也可以工作,但它没有真正重新加载,但是使用相对路径则可以重新加载。 - Michael Durrant
3
@MichaelDurrant,load 'prime.rb' 没有起作用的原因是 Ruby 有一个标准库类叫做 Prime,所以你实际上加载的是这个类而不是你的 prime.rb 文件。 - engineersmnky
3
@engineersmnky什么都瞒不过。 - Cary Swoveland
我遇到了另一个文件名相同的问题,名为config/application.rb(在lambda中,以模拟类似于Rails的文件),load返回true,但它仍然没有捕捉到代码更改,我不认为这与标准库有冲突。 - Juan José Ramírez
显示剩余3条评论

3
require 命令用于加载另一个.rb文件。一旦文件被加载,require 要求就满足了,后续对相同目标文件的 require 调用将被忽略。这使得在许多源文件中散布相同的 require 调用是安全的 - 在第一次执行后它们实际上不会有任何作用。
可以使用 load 命令强制加载文件 - 这应该正好做你所期望的事情(require 命令在检查文件是否已被要求后调用 load 命令)。
请注意,如果您处于普通的Ruby环境中(即自己调用方法或实例化对象),所有这些都很直接。但如果牵涉到 "大佬" 之一 - Rails,情况可能会变得有点棘手。Rails 在后台执行许多操作,以自动要求缺少的内容(因此,在 Rails 代码中看到的显式 require 调用非常少) - 这导致在 irb 中明确使用 load 有时似乎没有效果。

Ruby on Rails有一个自动加载器可以做到这一点,但它也会做很多奇怪的事情来避免定义你认为你正在定义的常量,而是用类似命名的匿名类替换它们。这意味着它们可以被抛弃并无缝地替换。自己做这个可能要求太高了,因此使用ActiveSupport可能是一个现成的解决方案。 - tadman

1

使用PRY:

在我的情况下,load返回了true,并且通过$ MyClass.method我可以看到新的源代码,但是该方法仍然执行旧代码。

我按照建议这里使用了reset命令(仅限于pry),问题得以解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接