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



如果您更改文件然后在 pry 或 irb 中重新加载它,它似乎会拾取您添加到该类中的任何新功能,但不会忘记您从该类中删除的旧功能。

重现步骤:

  1. 使用单个方法创建一个类 - 例如。 say_hello .
  2. 打开 PRY 或 IRB,load 'my_class.rb'
  3. 编辑你的类 - 删除现有方法,并添加一个具有不同名称的新方法 - 例如。 say_goodbye
  4. 重新加载您的课程 - load 'my_class.rb'

您的两种方法现在都可用。我明白为什么会发生这种情况 - 因为 ruby 允许您重新打开类进行修改,重新加载文件基本上只是重新打开您已经加载的类的现有版本,而不是擦除该类的内存并从头开始再次定义类。

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

谢谢!

您可以使用

remove_const从其父级中删除该类,也可以从其所在的Module中删除该类:

My::Module.send(:remove_const, :MyClass)

或者从Object,如果未在模块中声明:

Object.send(:remove_const, :MyClass)

如果你不需要有选择地重新加载特定的模块、类等,并且想要保留你的局部变量,只需:

reload!

当你在撬动时,你可以使用reset,这将重置环境。

要重置IRB,您可以看到此答案,即exec($0)

根据重置是执行"撬"(+ 一些撬的东西)。 IRB 中的 0 美元似乎是"IRB",而在撬中,0 美元是"撬"。

$0 是一个全局变量,表示"正在运行的程序",因此这并不奇怪。

不过,查看 Pry 中的源代码以获取重置命令,我有点惊讶它们按名称引用 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 所回答的那样。

最新更新