PRY或IRB - 重新加载类并忘记删除的功能

时间:2014-11-22 03:05:10

标签: ruby irb pry

如果你更改了一个文件,然后用pry或irb重新加载它,它似乎会获得你已经添加到该课程中的任何新功能,但不会忘记你所使用的OLD功能。已从该课程中删除。

重现的步骤:

  1. 使用单一方法创建一个类 - 例如。 say_hello
  2. 打开PRY或IRB,以及load 'my_class.rb'
  3. 编辑您的类 - 删除现有方法,并添加一个具有不同名称的新方法 - 例如。 say_goodbye
  4. 重新加载您的课程 - load 'my_class.rb'
  5. 您的方法现在可用。我知道为什么会发生这种情况 - 因为ruby允许你重新打开类进行修改,重新加载你的文件基本上只是重新打开你已经加载的类的现有版本,而不是擦除该类的内存并从头开始再次定义课程。

    我的问题是,除了退出和重新开始PRY或IRB之外,你如何解决这个问题?你怎么只是说"完全忘记我以前的课程并从头开始重新加载这个文件"?

    谢谢!

3 个答案:

答案 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!