2014-05-01 30 views
1

我是編程的初學者,我試圖完成Zed Shaw的Ruby書,而我無法理解代碼的最後一個for聲明。如果變量stateabbrev尚未定義,軟件如何知道從哪裏獲取值?Ruby用於使用未定義變量的語句

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 

回答

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" 
+0

謝謝你的回答!我現在更清楚了:) – Amir

0

for - in構建體中通過states哈希這種情況下進行迭代;對於每個鍵值對,將state設置爲該鍵,並將abbrev設置爲該值。所以,第一次通過,state設置爲'Oregon'abbrev設置爲'OR',然後state設置爲'Florida'abbrev通過整個哈希設置爲'FL',等等。這只是將for - in語法定義爲在Ruby中工作的方式。

+0

謝謝!這現在更有意義,雖然作爲初學者我仍然覺得很奇怪。 – Amir