class Binding
def irb(show_code: true)
Cooked potato: true
irb(#
output printed to standard output in this example:
resume execution where +binding.irb+ had paused it, as you can see from the
You can exit the IRB session with the +exit+ command. Note that exiting will
=> true
irb(#
=> ".../2.5.1/lib/ruby/2.5.0/irb/workspace.rb:85:in `eval'"
irb(#
=> Potato
irb(#
=> false
irb(#
context. This allows you to debug without having to run your code repeatedly:
You can type any valid Ruby code and it will be evaluated in the current
irb(#
9: Potato.new
8:
7: end
6: end
5: puts "Cooked potato: #{@cooked}"
=> 4: binding.irb
3: @cooked = false
2: def initialize
1: class Potato
From: potato.rb @ line 4 :
$ ruby potato.rb
+binding.irb+ is called, and you will see the following:
Running
ruby potato.rb
will open an IRB session wherePotato.new
end
end
puts "Cooked potato: #{@cooked}"
binding.irb
@cooked = false
def initialize
class Potato
Given a Ruby file called +potato.rb+ containing the following code:
the current scope, and mutate state if you need to.
interactive debugging. You can call any methods or variables available in
Opens an IRB session where +binding.irb+ is called which allows for
def irb(show_code: true) # Setup IRB with the current file's path and no command line arguments IRB.setup(source_location[0], argv: []) # Create a new workspace using the current binding workspace = IRB::WorkSpace.new(self) # Print the code around the binding if show_code is true STDOUT.print(workspace.code_around_binding) if show_code # Get the original IRB instance debugger_irb = IRB.instance_variable_get(:@debugger_irb) irb_path = File.expand_path(source_location[0]) if debugger_irb # If we're already in a debugger session, set the workspace and irb_path for the original IRB instance debugger_irb.context.workspace = workspace debugger_irb.context.irb_path = irb_path # If we've started a debugger session and hit another binding.irb, we don't want to start an IRB session # instead, we want to resume the irb:rdbg session. IRB::Debug.setup(debugger_irb) IRB::Debug.insert_debug_break debugger_irb.debug_break else # If we're not in a debugger session, create a new IRB instance with the current workspace binding_irb = IRB::Irb.new(workspace) binding_irb.context.irb_path = irb_path binding_irb.run(IRB.conf) binding_irb.debug_break end end