From: "Brian Schröder" Date: 2005-11-23T16:53:37+09:00 Subject: Re: [BUG] string range membership On 23/11/05, Warren Brown wrote: > All, > > I ran across some code that was trying to validate that an integer > was in a given range, however the integer and the range were Strings. > The problem boils down to this: > > >ruby -e "p ('1'..'10').member?('2')" > false > > Given that... > > >ruby -v -e "('1'..'10').each {|s| p s}" > ruby 1.8.2 (2004-12-25) [i386-mswin32] > "1" > "2" > "3" > "4" > "5" > "6" > "7" > "8" > "9" > "10" > > ...it seems like ('1'..'10').member?('2') should return true. The > problem lies in range.c, in the range_each_func() method. This method > starts with the first value, then calls succ() to get the next value, > breaking out of the loop when the value is no longer less than or equal > to the ending value (or strictly less than the ending value on an > exclusive range). Unfortunately, for the given string range this > happens immediately, since '2' > '10'. > > I suppose that it could be argued that this is not a bug, but that > would be a difficult argument to win. Also, I need to make sure that > this is still a bug in the latest version of Ruby. Unfortunately, I'm > too sleepy to investigate further or create a patch for this tonight, > but I'll try to work on it some more tomorrow night (assuming nobody > else fixes it first). > > - Warren Brown > > > I'd argue that it is not a bug, as there is no unique isomorphie from strings to integers. Some well known functions would be hex, octal and decimal encoding. I.e. '2' ... '10' could be understood as 2 ... 8, or 2 ... 16 or 2 ... 10 or error ... 2 depending on the base. Only you can now what the string means, so convert it to an integer and do the range test on integers. So I think you should save your time on creating the patch and preferably fix the application code. Brian -- http://ruby.brian-schroeder.de/ Stringed instrument chords: http://chordlist.brian-schroeder.de/