A Range is an ordered sequence of integers that are equally spaced apart. For example, "1, 2, 3" is a range, as is "5, 8, 11, 14". To create a range in Scala, use the predefined methods to, until, and by. 1 to 3 generates "1, 2, 3" and 5 to 14 by 3 generates "5, 8, 11, 14".

If you want to create a range that is exclusive of its upper limit, then use until instead of to: 1 until 3 generates "1, 2".

Note that Range(a, b, c) is the same as a until b by c

Ranges are represented in constant space, because they can be defined by just three numbers: their start, their end, and the stepping value. Because of this representation, most operations on ranges are extremely fast.

A range's upper bound is not inclusive:

val someNumbers = Range(0, 10)
val second = someNumbers(1)
val last = someNumbers.last

someNumbers.size should be(res0)
second should be(res1)
last should be(res2)

Ranges can be specified using 'until':

val someNumbers = Range(0, 10)
val otherRange = 0 until 10

(someNumbers == otherRange) should be(res0)

Range can specify a step for an increment:

val someNumbers = Range(2, 10, 3)
val second = someNumbers(1)
val last = someNumbers.last

someNumbers.size should be(res0)
second should be(res1)
last should be(res2)

A range does not include its upper bound, even in a step increment:

val someNumbers = Range(0, 34, 2)
someNumbers.contains(33) should be(res0)
someNumbers.contains(32) should be(res1)
someNumbers.contains(34) should be(res2)

Range can specify to include its upper bound value:

val someNumbers = Range(0, 34).inclusive

someNumbers.contains(34) should be(res0)

Inclusive ranges can be specified using 'to':

val someNumbers = Range(0, 34).inclusive
val otherRange = 0 to 34

(someNumbers == otherRange) should be(res0)