実行中のスクリプトからIRBプロンプトにドロップするにはどうすればよいですか?
質問
実行中のRubyスクリプトからIRBプロンプトにドロップできますか?
スクリプトを実行したいのですが、プログラムの現在の状態を備えたプログラムのポイントでIRBプロンプトを与えてもらいますが、RDEBUGを実行してブレークポイントを持つだけではありません。
解決
Ruby-Debugを使用してIRBにアクセスできます
require 'rubygems'
require 'ruby-debug'
x = 23
puts "welcome"
debugger
puts "end"
プログラムがデバッガーに到達すると、IRBにアクセスできます。
他のヒント
こじ開けます (IRBの代替品)もこれを行うことができます。実際、このユースケースのためにゼロから設計されました:)
それは置くのと同じくらい簡単です binding.pry
セッションを開始したい時点で:
require 'pry'
x = 10
binding.pry
そしてセッション内:
pry(main)> puts x
=> 10
ウェブサイトをチェックしてください: http://pry.github.com
pryしましょう:
- コードの任意の時点でセッションに立ち寄る
- メソッドソースコードを表示します
- メソッドのドキュメントを表示する(RIを使用しないため、事前に生成する必要はありません)
- さまざまなコンテキストに出入りする
- 構文強調表示
- 要点統合
- 履歴を表示および再生します
- 使用してメソッドを編集する編集者をオープンします
edit obj.my_method
構文
より素晴らしいオリジナルの機能
どうやら、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
この機能は、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
ブレークポイントが必要な場所にこの行を追加するだけです。
require 'ruby-debug';debugger
ただし、非常に便利なIRBの代わりにPryを使用することをお勧めします。代わりに次の行を挿入します。
require 'pry'; binding.pry
私はゲームにかなり遅れていますが、すでにIRB/PRY内からスクリプトをロードしている場合は、簡単です raise
また、IRB/PRYプロンプトに戻ってくるようになります。 Railsコンソール内に1つのスクリプトを書き込むとき、私はこれを非常に頻繁に使用します。