如果你更改了一个文件,然后用pry或irb重新加载它,它似乎会获得你已经添加到该课程中的任何新功能,但不会忘记你所使用的OLD功能。已从该课程中删除。
重现的步骤:
say_hello
。load 'my_class.rb'
say_goodbye
load 'my_class.rb'
您的方法现在可用。我知道为什么会发生这种情况 - 因为ruby允许你重新打开类进行修改,重新加载你的文件基本上只是重新打开你已经加载的类的现有版本,而不是擦除该类的内存并从头开始再次定义课程。
我的问题是,除了退出和重新开始PRY或IRB之外,你如何解决这个问题?你怎么只是说"完全忘记我以前的课程并从头开始重新加载这个文件"?
谢谢!
答案 0 :(得分:3)
您可以使用remove_const从其父级中删除该类,或者来自Module
所在的类:
My::Module.send(:remove_const, :MyClass)
或来自Object
,如果它未在模块中声明:
Object.send(:remove_const, :MyClass)
答案 1 :(得分:1)
当您处于撬状态时,可以使用reset
,这将重置环境。
要重置IRB,您可see this answer,即exec($0)
根据重置是exec' pry' (+一些Pry' s)。 IRB中的0美元似乎是" irb"而在撬中,0美元就是" pry"。
$ 0是一个全局变量,意味着正在运行的程序'所以这并不奇怪。
请查看Pry中的源代码以获取reset命令,我有点惊讶他们通过名称引用pry,而不是这个众所周知的变量。
以下是来自Pry的代码,它提供了重置功能,以及增加内存使用的原因。
class Command::Reset < Pry::ClassCommand
match 'reset'
group 'Context'
description 'Reset the REPL to a clean state.'
banner <<-'BANNER'
Reset the REPL to a clean state.
BANNER
def process
output.puts 'Pry reset.'
exec 'pry'
end
end
此列表中最后一行的第三行是一行。
更清洁的方式实际上是自己做家务,正如Uri所回答。
答案 2 :(得分:0)
如果您不需要选择性地重新加载特定的模块,类等,并且想要保留局部变量,只需:
reload!