我想在 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 中。
Kernel#load
与 rb 文件的相对路径:
irb> load './path/to/prime.rb'
Kernel#require
仅加载源文件一次,而 Kernel#load
每次调用时都会加载它。
require
只是说您实际上“需要”加载其他一些 .rb 文件。一旦加载,该要求就得到满足,并且使用相同目标文件的进一步 require
调用将被忽略。这使得相同的 require
调用可以自由地分布在许多源文件中 - 在执行第一个文件后,它们实际上不会执行任何操作。
您可以使用
load
强制它实际加载文件 - 这应该完全符合您的预期(require
在检查文件是否已被需要后调用 load
)。
请注意,如果您处于普通的旧版 ruby 环境中(即,自己调用方法或实例化对象),所有这些都是简单的,但如果涉及其中一个“大枪”(又称 Rails),则可能会变得有点麻烦。 Rails 在幕后做了很多魔法来自动需要丢失的东西(这就是为什么你在 Rails 代码中看到如此少的显式
require
调用)——这导致 load
中的显式 irb
有时看起来没有效果。