1

我是编程初学者,我正在尝试完成 Zed Shaw 的 Ruby 书籍,但我无法理解for代码的最后一条语句。如果变量stateabbrev尚未定义,软件如何知道从哪里获取它们的值?

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
4

2 回答 2

1

这些变量仅在for...end迭代中有效。它类似于块变量,例如x在一个块{|x| .... x ...}中。将值分配给 的每个元素states,或者,如果它不具有元素的自然意义to_a,则将应用 。在下面,e被分配一个元素states

for e in states
  ...
end

并在每次迭代时更改。由于states是散列,因此它将是一个键值对数组,例如['Oregon', 'OR'].

但还有一个更复杂的情况。这称为破坏性分配。当变量的数量和对象在赋值过程中不匹配时,Ruby 会尝试尽可能地分配它们以使其更有意义。在这种情况下,你有stateabbrev,这是两个变量,被分配一个像['Oregon', 'OR']. Ruby 分解该数组,并将其元素分配给每个变量:

state # => "Oregon"
abbrev # => "OR"
于 2014-05-01T07:28:53.453 回答
0

在这种情况下for-in构造遍历states哈希;对于每个键值对,state设置为键并abbrev设置为值。所以第一次通过,state被设置为'Oregon'并被abbrev设置为'OR',然后state被设置为'Florida'并被abbrev设置为'FL',以此类推通过整个哈希。这就是for-in语法被定义为在 Ruby 中工作的简单方式。

于 2014-05-01T07:26:16.023 回答