From: "Victor \"Zverok\" Shepelev" Date: 2007-06-27T06:42:27+09:00 Subject: Fun about inspect 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 : # => 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.