Amir
Amir

Reputation: 197

Ruby for statement using undefined variables

I'm a beginner at programming, and I'm trying to complete Zed Shaw's book for Ruby, and I just cannot understand the last for statement of the code. If the variables state and abbrev have not been defined, how does the software know where to get values for them?

states = {
    'Oregon' => 'OR',
    'Florida' => 'FL',
    'California' => 'CA',
    'New York' => 'NY',
    'Michigan' => 'MI'
}

cities = {
    'CA' => 'San Francisco',
    'MI' => 'Detroit',
    'FL' => 'Jacksonville'
}

for state, abbrev in states
    puts "%s state is abbreviated %s and has city %s" % [
        state, abbrev, cities[abbrev]]
end

Upvotes: 1

Views: 71

Answers (2)

sawa
sawa

Reputation: 168081

Those variables are valid only within the for ... end iteration. It is similar to block variables such as x in a block {|x| .... x ...}. The values are assigned to each element of states, or, if it does not have a natural sense of an element, then to_a, will be applied. In the following, e is assigned an element of states,

for e in states
  ...
end

and change each time as it goes through the iteration. Since states is a hash, it will be an array of key-value pair like ['Oregon', 'OR'].

But there is one more complication to that; that is called destructive assignment. When the number of variables and the object does not match during assignment, Ruby tries to distribute them to make much sense as possible. In this case, you have state and abbrev, which are two variables, to be assigned a single array like ['Oregon', 'OR']. Ruby decomposes that array, and assigns its elements to each variable:

state # => "Oregon"
abbrev # => "OR"

Upvotes: 1

Darshan Rivka Whittle
Darshan Rivka Whittle

Reputation: 34031

The for-in construct in this case iterates through the states Hash; for each key-value pair, state is set to the key and abbrev is set to the value. So the first time through, state is set to 'Oregon' and abbrev is set to 'OR', then state is set to 'Florida' and abbrev is set to 'FL', and so on through the whole Hash. This is simply the way the for-in syntax is defined to work in Ruby.

Upvotes: 0

Related Questions