What's the point of an interactive Ruby subshell?

irb, ruby, shell, terminal

Solution

So far I've seen three usefull things irb subsessions can do for you:

- undefine local variables

- change `self` of an irb session

- `irb` is a part of a great set of tools

undefine local variables

The nested `irb` starts a new subsession in which all local variables (not classes, modules etc.) are not defined any more.

irb(main):001:0> a = 1
#=> 1
irb(main):002:0> irb
irb#1(main):001:0> a
  NameError: undefined local variable or method `a' for main:Object from (irb#1):1

change `self` for an irb session

irb(main):001:0> self
#=> main
irb(main):002:0> irb "Hello World"
irb#1(Hello World):001:0> self
#=> "Hello World"
irb#1(Hello World):002:0> length
#=> 11

Note: This is also known as "change binding" of an irb session.

By the way: It's possible to change the binding without opening a subsession (`cb`, `irb_change-binding` both do that for you). But it's more convenient to get back to the old binding with subsession.

The best thing is, that `irb` is just one of a useful set of commands

- `irb`: start a new subsession

- `jobs`: list subsessions

- `fg`: switch to a subsession

- `kill`: kill a subsession

See this insteresting SO answer for details.

Problem

Starting up an interactive Ruby shell in the Terminal ('irb'), one can continue to open up irb subshells endlessly. What's the point of this?

Original source