From: Bill Lear Date: 2008-05-01T23:45:31+09:00 Subject: Re: Ruby exceptions and YAML Stefano Crocco wrote: > On Thursday 01 May 2008, Bill Lear wrote: >> I would think that for any ruby object 'obj', the following should >> hold: >> >> obj == YAML::load(YAML::dump(obj)) >> >> but this seems to not be the case. > > It depends on the == methods for the class in question. If you try the > same > using, for example, an array, you'll find that the comparison returns > true. > This happens because Array redefines the == method defined in class > Object, > which returns true only if the two operands are the same object. Class > Exception, instead, doesn't redefine it, and so the comparison between > two > exceptions will always return false, unless they're the same object. > This > means that this will return false: > > RuntimeError.new('msg') == RuntimeError.new('msg') > > Since YAML.load creates a new object basing on the contents of its > argument, > the returned Exception is different (according to ==) from the original. > > I hope this helps > > Stefano Thanks for the clarification, but that's really not the main issue, although it is curious to me that '==' means "the same object" rather than logically identical, but if that is a ruby-esque idiosyncrasy, then I can live with it. The main issue is why the "message" member of the exception is clearly in the YAML dumped output, but is not loaded and available to the loaded instance. That, to me, is a far more serious problem. Again, if I do this: yamilized_exception = YAML::load(YAML::dump(original_exception)) then yamlized_exception.message will be (in my case) "RuntimeError", whereas original_exception.essage will be "Ain't got no mojo", even though the YAML::dump(original_exception) is: --- !ruby/exception:RuntimeError message: Ain't got no mojo Bill Bill -- Posted via http://www.ruby-forum.com/.