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
#<Range:0x20050560> (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
#<Range:0x2004ff48> (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