Ruby's arrays and hashes are indexed collections. Both store
collections of objects, accessible using a key. With arrays, the key
is an integer, whereas hashes support any object as a key. Both
arrays and hashes grow as needed to hold new elements. It's more
efficient to access array elements, but hashes provide more
flexibility. Any particular array or hash can hold objects of
differing types; you can have an array containing an integer, a
string, and a floating point number, as we'll see in a minute.
You can create and initialize a new array using an array literal---a
set of elements between square brackets. Given an array object, you
can access individual elements by supplying an index between
square brackets, as the next example shows.
a = [ 1, 'cat', 3.14 ] # array with three elements
|
# access the first element
|
a[0]
|
� |
1
|
# set the third element
|
a[2] = nil
|
# dump out the array
|
a
|
� |
[1, "cat", nil]
|
You can create empty arrays either by using an array literal with no
elements or by using the array object's constructor,
Array.new
.
empty1 = []
empty2 = Array.new
|
Sometimes creating arrays of words can be a pain, what with all the
quotes and commas. Fortunately, there's a shortcut:
%w
does just
what we want.
a = %w{ ant bee cat dog elk }
|
a[0]
|
� |
"ant"
|
a[3]
|
� |
"dog"
|
Ruby hashes are similar to arrays. A hash literal uses braces rather than
square brackets. The literal must supply two objects for every
entry: one for the key, the other for the value.
For example, you might want to map musical instruments to their
orchestral sections. You could do this with a hash.
instSection = {
'cello' => 'string',
'clarinet' => 'woodwind',
'drum' => 'percussion',
'oboe' => 'woodwind',
'trumpet' => 'brass',
'violin' => 'string'
}
|
Hashes are indexed using the same square bracket notation as arrays.
instSection['oboe']
|
� |
"woodwind"
|
instSection['cello']
|
� |
"string"
|
instSection['bassoon']
|
� |
nil
|
As the last example shows, a hash by default returns
nil
when
indexed by a key it doesn't contain. Normally this is convenient, as
nil
means
false
when used in conditional expressions.
Sometimes you'll want to change this default. For example, if you're
using a hash to count the number of times each key occurs, it's
convenient to have the default value be zero. This is easily done by
specifying a default value when you create a new, empty
hash.
histogram = Hash.new(0)
|
histogram['key1']
|
� |
0
|
histogram['key1'] = histogram['key1'] + 1
|
histogram['key1']
|
� |
1
|
Array and hash objects have lots of useful methods: see the discussion
starting on page 33, and the reference sections starting on
pages 278 and 317, for details.