IRb: how to start an interactive ruby session with pre-loaded classes
I'm not sure it's possible to 'flush' a session. However, you can load your classes like this:
irb -r 'hello.rb' -r 'hello_objects.rb'
How to create custom IRB file to load a Ruby project's files, gems and dependencies?
Very simple, actually:
#!/usr/bin/env ruby
require "bundler/setup"
# ...
# everything else you need
# ...
require "irb"
IRB.start
When you start IRB using IRB.start
, you will have available everything that's been loaded/initialised before it.
automatically load project's environment to irb
Your project should have one file which loads the environment. Assuming your project is in lib/project.rb then simply:
$ irb -Ilib -rproject
Ruby / IRB environment issue on MacOSX
I didn't know there was a "help" command, but apparently it has dependency on FileUtils, probably to load help files. "help" is loading its requirements into the IRB session.
>> before = ObjectSpace.each_object.map { |i| i.class }.uniq
=> [Regexp, String, Array, Class, Hash, Module, Proc, MatchData, File, Binding, NoMemoryError, Float, SystemStackError, fatal, Bignum, Object, IO, Thread, ThreadGroup, IRB::Locale, IRB::Notifier::LeveledNotifier, IRB::Notifier::CompositeNotifier, IRB::StdioOutputMethod, IRB::Notifier::NoMsgNotifier, Enumerable::Enumerator, RubyToken::TkNL, RubyToken::TkEND, RubyToken::TkBITOR, RubyToken::TkIDENTIFIER, RubyToken::TkDOT, RubyToken::TkRBRACE, RubyToken::TkSPACE, RubyToken::TkfLBRACE, RubyToken::TkCONSTANT, RubyToken::TkASSIGN, IRB::SLex::Node, IRB::SLex, RubyLex, IRB::ReadlineInputMethod, IRB::WorkSpace, IRB::Context, IRB::Irb]
>> help
=> nil
>> after = ObjectSpace.each_object.map { |i| i.class }.uniq
=> [Regexp, String, MatchData, Array, Class, RI::ClassEntry, RI::MethodEntry, Hash, Module, Dir, Proc, File, Binding, NoMemoryError, Float, SystemStackError, fatal, Bignum, Object, IO, Thread, ThreadGroup, IRB::Locale, Range, IRB::Notifier::LeveledNotifier, IRB::Notifier::CompositeNotifier, IRB::StdioOutputMethod, IRB::Notifier::NoMsgNotifier, YAML::Syck::Resolver, Gem::ConfigFile, RubyToken::TkNL, RubyToken::TkIDENTIFIER, IRB::SLex::Node, IRB::SLex, RubyLex, IRB::ReadlineInputMethod, IRB::WorkSpace, IRB::Context, IRB::Irb, RI::TopLevelEntry, RI::RiReader, GetoptLong, RI::RiCache, RI::Options, RiDriver, Rational, Date::Infinity, Enumerable::Enumerator, RubyToken::TkRBRACE, DefaultDisplay, RI::TextFormatter]
>> after == before
=> false
>> after - before
=> [RI::ClassEntry, RI::MethodEntry, Dir, Range, YAML::Syck::Resolver, Gem::ConfigFile, RI::TopLevelEntry, RI::RiReader, GetoptLong, RI::RiCache, RI::Options, RiDriver, Rational, Date::Infinity, DefaultDisplay, RI::TextFormatter]
It loads the classes in after - before
. Where is FileUtils you say? I think its a module that is part of Dir
, but I am not 100% on that.
How to run IRB.start in context of current class
I'd suggest trying this in ripl, an irb alternative. The above example works:
a = 'hello'
require 'ripl'
Ripl.start :binding => binding
Note that local variables work because your passing the current binding with the :binding option.
You could possibly do the same in irb, but since it's poorly documented and untested, your chances of doing it cleanly are slim to none.
automatically load project's environment to irb
Your project should have one file which loads the environment. Assuming your project is in lib/project.rb then simply:
$ irb -Ilib -rproject
Can you 'require' ruby file in irb session, automatically, on every command?
I usually create a simple function like this:
def reload
load 'myscript.rb'
# Load any other necessary files here ...
end
With that, a simple reload
will re-import all of the scripts that I'm working on. It's not automatic, but it's the closest thing that I've been able to come up with.
You may be able to override method_missing
to call this function automatically when your object is invoked with a method that doesn't exist. I've never tried it myself, though, so I can't give any specific advice. It also wouldn't help if you're calling a method that already exists but has simply been modified.
In my own laziness, I've gone as far as mapping one of the programmable buttons on my mouse to the key sequence "reload<enter>". When I'm using irb
, all it takes is the twitch of a pinky finger to reload everything. Consequently when I'm not using irb
, I end up with the string "reload" inserted in documents unintentionally (but that's a different problem entirely).
What's the point of an interactive Ruby subshell?
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 subsessionjobs
: list subsessionsfg
: switch to a subsessionkill
: kill a subsession
See this insteresting SO answer for details.
Related Topics
How to Use Link_To to Link an Image and a Text
How to Write Bom Marker to a File in Ruby
Duplicating a Ruby Array of Strings
Need to Use Add_Index on Migration for Belongs_To/Has_Many Relationship? (Rails 3.2, Active Record)
Displaying a Polygon with Gmaps4Rails
Rails: How to Print a Decimal as a Percent
How to Dynamically Define a Method as Private
Create a Tempfile Without Opening It in Ruby
Rails/Activerecord: Save Changes to a Model's Associated Collections
How to Source Environment Variables for a Command Shell in a Ruby Script
Ruby Mailer Is Coming Up with an Eoferror
Could Not Find Rake-10.0.4 in Any of the Sources (Bundler::Gemnotfound)
Create a Human-Readable List with "And" Inserted Before the Last Element from a Ruby List
How to Get the Number of Elements Having Same Attribute in HTML in Watir
Zentest Autotest Not Running Tests