views:

319

answers:

1

In scala, you often use an iterator to do a for loop in an increasing order like:

for(i <- 1 to 10){ code }

How would you do it so it goes from 10 to 1? I guess 10 to 1 gives an empty iterator (like usual range mathematics)?

I made a scala script which solves it by calling reverse on the iterator, but it's not nice in my opinion, is this the way to go:

def nBeers(n:Int) = n match {

case 0 => ("No more bottles of beer on the wall, no more bottles of beer."+

"\nGo to the store and buy some more, "+

"99 bottles of beer on the wall.\n")

case _ => (n+" bottles of beer on the wall, "+n

+" bottles of beer.\n"+"Take one down and pass it around, "+

(if((n-1)==0) "no more" else (n-1))+

" bottles of beer on the wall.\n")

}

for(b <- (0 to 99).reverse)println(nBeers(b)) 

?? Any comments/suggestions?

+13  A: 
scala> 10 to 1 by -1
res1: scala.collection.immutable.Range = Range(10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
Randall Schulz
Which is very nice :-) Thanks alot
Felix
@Felix: You're welcome. I should have also pointed out that there is also `until` that you can use in place of `to` to exclude the right-hand end-point from the range. The left-hand endpoint is always included.
Randall Schulz
I already knew about the until, the until is also a function on Integers, however, "by" must be a function on the range/iterator whatever is returned from the "to" and "until" functions. Thanks anyway :)
Felix