我进入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得出相似的结果
答案 0 :(得分:3)
尝试Kernel#load
,并提供相对于rb文件的相对路径:
irb> load './path/to/prime.rb'
Kernel#require
仅加载一次源文件,而Kernel#load
每次调用时加载一次。
答案 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