# Collections

Arrays are ordered, integer-indexed collections of any object.

``````# creating an empty array and adding values
var a = []          #=> []
a = 1            #=> 
a = "abc"        #=> [1, nil, nil, "abc"]
a << 3.14           #=> [1, nil, nil, "abc", 3.14]
``````

A Hash is a dictionary-like collection of unique keys and their values. Also called associative arrays, they are similar to Arrays, but where an Array uses integers as its index, a Hash allows you to use any object type, which is automatically converted into a String.

``````# creating an empty hash
var h = Hash()    #=> Hash()
h{:foo} = 1       #=> Hash("foo"=>1)
h{:bar} = 2.4     #=> Hash("foo"=>1, "bar"=>2.4)
h{:bar} += 3      #=> Hash("foo"=>1, "bar"=>5.4)
``````

A Pair is an array-like collection, but restricted only to two elements.

``````# create a simple pair
var p = Pair('a', 'b')
say p.first;            #=> 'a'
say p.second;           #=> 'b'

# create a pair of pairs
var pair = 'foo':'bar':'baz':();   # => Pair('foo', Pair('bar', Pair('baz', nil)))

# iterate over the values of a pair of pairs
loop {
say pair.first;                #=> 'foo', 'bar', 'baz'
pair = pair.second;
pair == nil && break;
}
``````

A Struct is a convenient way to bundle a number of attributes together.

``````# creating a struct
struct Person {
String name,
Number age,
String sex
}

var a = Person("John Smith", 41, :man)

a.age += 1                  # increment age
a.name = "Dr. #{a.name}"    # update name

say a.name          #=> "Dr. John Smith"
say a.age           #=> 42
say a.sex           #=> "man"
``````