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
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
print "testing %-10.10s: " % obj.class.name
res = eval(obj.inspect)
if res == obj
print 'WRONG : ’
puts “\t%-7s => %-7s” % [obj.inspect, res.inspect]
#the tests itself
tst(5) #=> OK
tst(“str”) #=> OK
tst(RuntimeError.new) #=> WRONG : #<RuntimeError: RuntimeError> =>
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
we typically not plan to serialize and store exceptions. Even in this
results of #inspect are evaluated without any error!
- But Time is a bad guy! It’s #inspect result is something like “Wed Jun
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?