From: Oliver Dain Date: 2003-09-07T00:12:55+09:00 Subject: Re: Difference between .. and ... in boolean ranges Martin DeMello wrote: > Sean O'Dell wrote: >> >> Try: if (3..5) === x > > Yes, but this is a single boolean not a boolean range. From what I > understand of the flipflop behaviour, the two dot case behaves like > this: > > flag = true if (x==3) > if flag > body > end > flag = false if (x==5) > > so by analogy, I'd expect the three dot case to be > > flag = true if (x==3) > flag = false if (x==5) > if flag > body > end > > martin I think you've got the 2 dot case right, but the 3 dot case is wrong. Just to make the 2-dot and 3-dot cases look similar, here's another way to write the 2 dot code: if flag == true body if (x==5) flag = false else if (x==3) flag = true body if (x==5) flag = false end Then the 3 dot case the code is: if flag == true body if (x==5) flag = false else if (x==3) flag = true body end The only difference is that if the an x matches both the beginning and end condition your code doesn't execute body for that x while mine does: For example: 0.upto(9) {|x| if (x==3)...(x==3) puts "#{x} is a match" end } produces: 3 is a match 4 is a match 5 is a match 6 is a match 7 is a match 8 is a match 9 is a match your pseudo-code wouldn't have produced any output as x would have set the flag true, but then immediately set it false and body would never execute. What acutally happens is that when x is 3 it sets flag to true. The end condition is not checked that iteration in the 3 dot case. On the rest of the iterations the end condition is checked but it is never true so all the rest of the values are output. Just for reference, here's what the 2 dot case does: 0.upto(9) {|x| if (x==3)..(x==3) puts "#{x} is a match" end } produces: 3 is a match