summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authork0kubun <k0kubun@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-11-12 00:55:34 +0000
committerk0kubun <k0kubun@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-11-12 00:55:34 +0000
commit623ecdace6c9201aec8ae5dca88770cee6c85a37 (patch)
treec579ef7c0e376652dc18ea469de28c6790be3143
parent8db142018831fb744771784ac9c60ede0a6ad893 (diff)
Document binding.irb on Binding [ci skip]
For some reason this very useful method was undocumented since it was added in 493e48897421d176a8faf0f0820323d79ecdf94a which makes finding it in the docs impossible before this change. I've added a detailed example with sample code because it's one of the most powerful tools to debug Ruby code and I believe very few people are aware of it due to the lack of documentation. [Fix GH-2010] From: Olivier Lacan <hi@olivierlacan.com> git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@65674 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--lib/irb.rb58
1 files changed, 57 insertions, 1 deletions
diff --git a/lib/irb.rb b/lib/irb.rb
index 8595334..eb9547f 100644
--- a/lib/irb.rb
+++ b/lib/irb.rb
@@ -733,7 +733,63 @@ module IRB
end
class Binding
- # :nodoc:
+ # Opens an IRB session where `binding.irb` is called which allows for
+ # interactive debugging. You can call any methods or variables available in
+ # the current scope, and mutate state if you need to.
+ #
+ #
+ # Given a Ruby file called `potato.rb` containing the following code:
+ #
+ # class Potato
+ # def initialize
+ # @cooked = false
+ # binding.irb
+ # puts @cooked
+ # end
+ # end
+ #
+ # Potato.new
+ #
+ # Running `ruby potato.rb` will open an IRB session where `binding.irb` is
+ # called, and you will see the following:
+ #
+ # $ ruby potato.rb
+ #
+ # From: potato.rb @ line 3 :
+ #
+ # 1: class Potato
+ # 2: def initialize
+ # 3: @cooked = false
+ # => 4: binding.irb
+ # 5: puts "Cooked potato: #{@cooked}"
+ # 6: end
+ # 7: end
+ # 8:
+ # 9: Potato.new
+ #
+ # irb(#<Potato:0x00007feea1916670>):001:0>
+ #
+ # You can type any valid Ruby code and it will be evaluated in the current
+ # context. This allows you to debug without having to run your code repeatedly:
+ #
+ # irb(#<Potato:0x00007feea1916670>):001:0> @cooked
+ # => false
+ # irb(#<Potato:0x00007feea1916670>):002:0> self.class
+ # => Potato
+ # irb(#<Potato:0x00007feea1916670>):003:0> caller.first
+ # => ".../2.5.1/lib/ruby/2.5.0/irb/workspace.rb:85:in `eval'"
+ # irb(#<Potato:0x00007feea1916670>):004:0> @cooked = true
+ # => true
+ #
+ # You can exit the IRB session with the `exit` command. Note that exiting will
+ # resume execution where +binding.call+ had paused it, as you can see from the
+ # output printed to standard output in this example:
+ #
+ # irb(#<Potato:0x00007feea1916670>):005:0> exit
+ # $ Cooked potato: true
+ #
+ #
+ # See IRB@IRB+Usage for more information.
def irb
IRB.setup(eval("__FILE__"), argv: [])
workspace = IRB::WorkSpace.new(self)