Ruby - 如何重新加载 IRB 或 PRY 中发生更改的文件?

问题描述 投票:0回答:3

我想在 irb 中重新加载文件。该文件

prime.rb
包含以下代码:

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

我可以使用

require_relative
来请求文件:

irb(main):001> require_relative 'prime'
=> true
irb(main):002> is_prime? 10
=> false
irb(main):003> is_prime? 11
=> true

如果我对

prime.rb
进行更改,如何重新加载文件?我试过了:

irb(main):004> require_relative 'prime'
=> false

同样的行为也发生在 pry 中。

ruby irb pry
3个回答
11
投票

尝试

Kernel#load
与 rb 文件的相对路径:

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

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

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


3
投票

require
只是说您实际上“需要”加载其他一些 .rb 文件。一旦加载,该要求就得到满足,并且使用相同目标文件的进一步
require
调用将被忽略。这使得相同的
require
调用可以自由地分布在许多源文件中 - 在执行第一个文件后,它们实际上不会执行任何操作。

您可以使用

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

请注意,如果您处于普通的旧版 ruby 环境中(即,自己调用方法或实例化对象),所有这些都是简单的,但如果涉及其中一个“大枪”(又称 Rails),则可能会变得有点麻烦。 Rails 在幕后做了很多魔法来自动需要丢失的东西(这就是为什么你在 Rails 代码中看到如此少的显式

require
调用)——这导致
load
中的显式
irb
有时看起来没有效果。


1
投票

使用撬:

就我而言,

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

我按照建议使用

reset
命令(仅撬)解决了这里

© www.soinside.com 2019 - 2024. All rights reserved.