Hi -- On Thu, 1 Dec 2005, Bob Showalter wrote: > Dave Howell wrote: >> English speaker. >> >> Relative new Ruby user. >> >> My thoughts: forget it! Stop! Ahhhh! Kitchen sink! >> >> Let's see if I've got this straight. Somebody complained because >> >> ('1'..'10').member?('2') >> => false >> >> >> Good! > > No, not good. > > Range mixes Enumerable, but Range#member? does not behave like > Enumerable#member?, hence the confusion. > >> The fact that Ruby will get incredibly clever with strings and >> fabricate arbitrary sequences with them is a charming trick, but they are >> arbitrary, and it is a trick. >> >> The fact that '1', '2', ... '9','10' is obvious doesn't make it any less >> arbitrary. > > Yes, it is arbitrary, but nevertheless, the range '1'..'10' will produce the > value '2' (unless String#succ has been overridden), so '2' is by any > ordindary definition of the word member, a member of this range. I think it's more a question of the definition of the word "range". I've come to believe that ranges should be strictly interval-like in their behavior. Basically, a range is a kind of filter: (0...10) is not ten numbers, but rather an expression of "the fact of 0-through-10-ness", or something like that. At least, that's how I'd like to see ranges work. I think they're trying to be too many things at once. This is also why I think the idea of a mutable range is a contradiction in terms. You can't change what the fact of starting at 0 and ending at 10 means. David >> ('1'..'10').to_a.member?('2') >> => true >> >> Is that really such a big deal? >> > > No, that's fine. More efficient would be > > !('1'..'10').find({|x| x == '2'}).nil? I don't think find takes a hash argument :-) Also, why not lose the ! and the .nil? ? David -- David A. Black dblack / wobblini.net