2014-11-22 99 views
2

如果您更改文件然后以pry或irb重新加载它,它似乎会提取您添加到该类的任何新功能,但不会忘记您从该课程中删除的旧功能。PRY或IRB - 重新加载类并忘记已删除的功能

重现步骤:

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

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

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

谢谢!

回答

3

您可以使用remove_const从其父删除类,无论是从Module它是:

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

Object如果它不是一个模块中声明:

Object.send(:remove_const, :MyClass) 
1

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

要重置IRB可以see this answer这是说exec($0)

根据复位是EXEC“撬”(+一些撬的东西)。 IRB中的$ 0似乎是“irb”,在pry中,$ 0是“pry”。

$ 0是一个全局变量,意思是'正在运行的程序',所以这并不奇怪。

查看Pry中的源代码以获得重置命令,但我有些惊讶地发现它们引用的是pry的名称,而不是这个众所周知的变量。

下面是来自Pry的代码,它给出了reset的功能,以及为什么它增加了内存使用。

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回答。

+0

它似乎打开另一个Ruby(+一些库)。这会让你成为另一个〜80 Mb RAM。这可能是一个老版本/ Windows版本中的错误,但任何尝试此操作的人都应该意识到这一点。 – 2014-11-22 19:53:45

+0

哪个打开另一个Ruby和一些库?撬重置或执行($ 0)?任何人都应该知道这一点,@DarekNędza:) – vgoff 2014-11-23 03:03:37

+0

哦,对。我忘记了最重要的事情。那么,我已经检查了两个,Pry和IRB,他们都打开了另一个'ruby.exe'。好奇的人的其他信息:'reset'是'exec'pry''(+某些Pry的东西)。 IRB中的“$ 0”似乎是“irb”,在pry中,“$ 0”是“pry”。 – 2014-11-24 12:38:57