From: h.fulton@... Date: 2000-04-10T22:28:37+00:00 Subject: [ruby-talk:02437] Arrays and ranges I don't always go to the online reference when coding a construct I have never used before. It is one of the strengths of Ruby that it is intuitive, generalized, and flexible. I think matz has an idea of "least surprise" that coincides with that of most programmers. But sometimes I am surprised, and sometimes I am just confused. In this case, I have become more confused the more I think about it. Initially I was thinking, "What is the *right* way to print a range of numbers backwards?" It is mostly irrelevant to me whether they are stored or not. I was initially thinking of storing them. (Conrad's suggestion of 10.downto(1) is good if they are not to be stored.) Anyway, after some playing, here is what I found. See the code below. -------------------------------- #!/bin/ruby a=Array(1..5) b=1..5 c=[1..5] d=[1,2,3,4,5]; if c=d print "c and d are the same\n" else print "c and d are NOT the same\n" end # Above: Confirms that c and d are the same # Case 1 - works as expected. a.reverse.each { |i| print i, "\n"} # Case 2 - error # b.reverse.each { |i| print i, "\n"} # Above line gives error message below: # foo2.rb:15: undefined method `reverse' for # (NameError) # Case 3 - works as expected c.reverse.each { |i| print i, "\n"} # Case 4 - range constant # 1..5.reverse.each { |i| print i, "\n"} # Code above gives error below... probably precedence issue # foo2.rb:27: undefined method `reverse' for 5:Fixnum (NameError) # Case 5 - same as 4, but with parens # (1..5).reverse.each { |i| print i, "\n"} # Code above gives error below... interesting # foo2.rb:32: undefined method `reverse' for # (NameError) # Case 6 - array constant with range - prints "1..5" - surely a bug??? [1..5].reverse.each { |i| print i, "\n"} # Case 7 - array constant, non-range - works as expected [1,2,3,4,5].reverse.each { |i| print i, "\n"} -------------------------------- 1. Notice especially that an array variable and an array constant with the same value are treated differently. 2. Is it unreasonable to expect 'reverse' to be imple- mented for a range? 3. Is it unreasonable to expect that a range assigned to an array will populate the array? Thanks for any comments... Hal