43

我可以从正在运行的 Ruby 脚本转到 IRB 提示符吗?

我想运行一个脚本,然后让它在程序中的某个点以程序的当前状态给我一个 IRB 提示,但不仅仅是通过运行 rdebug 并有一个断点。

4

6 回答 6

46

Pry(一个 IRB 替代方案)也可以让你做到这一点,事实上它是为这个用例从头开始设计的 :)

binding.pry这就像在您想要开始会话的点上一样简单:

require 'pry'
x = 10
binding.pry

在会话内部:

pry(main)> puts x
=> 10

查看网站: http: //pry.github.com

撬开你:

  • 在代码中的任何位置进入会话
  • 查看方法源代码
  • 查看方法文档(不使用 RI,因此您不必预先生成它)
  • 进出不同的上下文
  • 语法高亮
  • 主旨整合
  • 查看和重播历史记录
  • 打开编辑器以使用edit obj.my_method语法编辑方法

一吨更伟大和原始的功能

于 2011-08-18T05:30:07.303 回答
29

你可以使用 ruby​​-debug 来访问 irb

require 'rubygems'
require 'ruby-debug'
x = 23
puts "welcome"
debugger
puts "end"

当程序到达调试器时,您将可以访问 irb。

于 2009-07-17T17:23:37.293 回答
14

显然,它需要大量代码才能放入 irb。

这是链接(似乎效果很好)。

http://jameskilton.com/2009/04/02/embedding-irb-into-your-ruby-application


require 'irb'

module IRB
  def self.start_session(binding) # call this method to drop into irb
    unless @__initialized
      args = ARGV
      ARGV.replace(ARGV.dup)
      IRB.setup(nil)
      ARGV.replace(args)
      @__initialized = true
    end

    workspace = WorkSpace.new(binding)

    irb = Irb.new(workspace)

    @CONF[:IRB_RC].call(irb.context) if @CONF[:IRB_RC]
    @CONF[:MAIN_CONTEXT] = irb.context

    catch(:IRB_EXIT) do
      irb.eval_input
    end
  end
end
于 2010-01-27T04:57:28.023 回答
10

此功能可从 Ruby 2.4 开始使用。你可以使用binding.irb

例如

require 'irb'
a = 10
binding.irb
puts a

如果您运行上面的代码,您将获得 irb 控制台,以便您可以检查局部变量的值以及范围内的任何其他内容。

资料来源:http ://blog.redpanthers.co/new-binding-irb-introduced-ruby-2-4/

红宝石提交:https ://github.com/ruby/ruby/commit/493e48897421d176a8faf0f0820323d79ecdf94a

于 2016-12-11T01:42:09.167 回答
0

只需将此行添加到您想要断点的位置:

require 'ruby-debug';debugger

但我建议使用 pry 而不是 irb,这非常方便,插入以下行:

require 'pry'; binding.pry

于 2014-11-01T19:24:24.473 回答
0

我玩游戏已经很晚了,但如果你已经从 irb/pry 加载脚本,一个简单的raise也可以让你回到 irb/pry 提示符。在 Rails 控制台中编写一个关闭脚本时,我经常使用它。

于 2018-02-06T19:57:40.000 回答