Hi all.

By some complex reasons, I've made an interesting conclusion: for
"serializable" types it's always good to have eval(obj.inspect) == obj

For me it was a good thought, because previously, I've always doubt what
#inspect should do, and typically have ended with #inspect as alias for
#to_s

Here is a dumb test for some core classes:

# dumb testing function
# tests, if eval(obj.inspect) == obj, and if any 
# parsing errors are thrown by evaluating
#
def tst(obj)
  begin
    print "testing %-10.10s: " % obj.class.name 
    res = eval(obj.inspect)
    if res == obj
      puts 'OK'
    else
      print 'WRONG : '
      puts "\t%-7s => %-7s" % [obj.inspect, res.inspect]
    end
  rescue Exception
    puts "ERROR"
  end
end

#the tests itself

tst(5)         #=> OK
tst("str")     #=> OK
tst(RuntimeError.new)     #=> WRONG : #<RuntimeError: RuntimeError> => nil

tst([1,2,3])   #=> OK
tst(:a => 1)   #=> OK
tst(Time.new)  #=> ERROR

There are several interesting things to note:
* basic types (Numeric, String, Array, Hash) are all behave good here.
* Exception descendants are evaluated to nil, which can be considered OK, as
we typically not plan to serialize and store exceptions. Even in this case,
results of #inspect are evaluated without any error!
* But Time is a bad guy! It's #inspect result is something like "Wed Jun 27
00:36:12 +0300 2007" and is equal to it's #to_s result and can't be
evaluated in any manner. I think, it's not the most reasonable variant.

What do you think?

V.