【问题标题】:PRY or IRB - reload class and forget deleted functionalityPRY 或 IRB - 重新加载类并忘记删除的功能
【发布时间】:2014-11-22 03:05:09
【问题描述】:

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

重现步骤:

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

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

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

谢谢!

【问题讨论】:

    标签: ruby irb pry


    【解决方案1】:

    您可以使用remove_const 将类从其父类中删除,或者从它所在的Module 中删除:

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

    或者来自Object,如果它没有在模块中声明:

    Object.send(:remove_const, :MyClass)
    

    【讨论】:

      【解决方案2】:

      当您处于窥探状态时,您可以使用reset,这将重置环境。

      要重置 IRB 你可以see this answer 也就是exec($0)

      根据 reset 是 exec 'pry'(+ 一些 Pry 的东西)。 IRB 中的 $0 似乎是“irb”,而在 pry 中,$0 是“pry”。

      $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 回答说,更清洁的方法实际上是自己做家务。

      【讨论】:

      • 似乎打开了另一个 Ruby(+ 一些库)。这又要花费您大约 80 Mb 的内存。这可能是旧/windows 版本中的一个错误,但任何尝试这样做的人都应该意识到这一点。
      • 哪个会打开另一个 Ruby 和一些库?撬重置或执行($ 0)?任何尝试什么的人也应该意识到这一点,@DarekNędza :)
      • 哦,对了。我忘记了最重要的事情。好吧,我已经检查了 Pry 和 IRB,它们都打开了另一个 ruby.exe。好奇的人的附加信息:resetexec 'pry'(+ 一些 Pry 的东西)。 IRB 中的$0 似乎是"irb",而在窥探中,$0"pry"
      • 我不是说 exec($0) 中的 pry,因为这不是 reset pry 的命令,而是 reset 命令本身。虽然在内部,它可能确实使用exec($0)。那么,您的意思是说,在这两种情况下,当您采用适当的方式进行重置时,内存都会增加?或者你的意思是说如果我自己加载应用程序,它会增加那个内存量?
      • 是的,当我输入exec($0)reset 时,内存会增加。
      【解决方案3】:

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

      reload!
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-06
        • 1970-01-01
        相关资源
        最近更新 更多