From: SonOfLilit Date: 2007-06-27T06:55:36+09:00 Subject: Re: Fun about inspect I've given up on #inspect. I use my #dump! method (VERY useful, search the list for it, the best four lines I've ever written) and use #to_yaml within it. Aur On 6/27/07, Victor Zverok Shepelev wrote: > 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. > > >