2016-09-29 30 views
0

代碼整個哈希被退回

$dail_book = { 
    "los_angeles" => 212, 
    "new_york" => 523, 
    "portland" => 234, 
    "seattle" => 502, 
    "miami" => 910, 
    "san_francisco" => 345, 
    "sioux_falls" => 543, 
    "omaha" => 642, 
    "minneapolis" => 342, 
    "san_diego" => 233 
} 

# Removes the underscore, captalizes each city, 
# and prints it back to the user 
def format_cities(k) 
    puts "#{k.split('_').map(&:capitalize).join(' ')}" 
end 


# Loops through $dail_book 
def display_cities 
    puts "Options: " 
    puts $dail_book.sort.each {|k,v| format_cities(k)} 
end 

輸出

Options: 
Los Angeles 
Miami 
Minneapolis 
New York 
Omaha 
Portland 
San Diego 
San Francisco 
Seattle 
Sioux Falls 
los_angeles 
212 
miami 
910 
minneapolis 
342 
new_york 
523 
omaha 
642 
portland 
234 
san_diego 
233 
san_francisco 
345 
seattle 
502 
sioux_falls 
543 

問題

爲什麼整個哈希得到在年底返回的循環?發生了什麼?

+1

只是用'map',而不是'each'。請參閱文檔。 – Ilya

+1

您可以刪除'format_cities'並添加'puts $ dail_book.keys.map {| citie | citie.split('_')。map(&:capitalize).join('')} .sort' –

回答

1

每種方法都會返回它被調用的原始可枚舉對象,這就是爲什麼在循環結束後保留​​整個散列值的原因。

1

你在你的代碼中調用puts兩次:

def format_cities(k) 
    puts ...   # <- here 
end 

def display_cities 
    # ... 
    puts $dail_bo... # <- and here 
end 

儘量保持你的方法集中和模塊化。 display_cities顯然顯示東西,所以puts預計在這裏。另一方面,format_cities轉換一個值。它不應該打印任何東西。

此外,它的名稱(..._cities,複數)建議它一次格式化多個城市,而它只格式化一個城市。因此,它應該被稱爲format_city(單數):

# removes the underscore, capitalizes each word 
def format_city(city) 
    city.split('_').map(&:capitalize).join(' ') 
end 

然後,移動印刷部到顯示相關的方法。但不是打印的each結果(返回集合),移動puts循環打印每格式化城市名稱:

def display_cities 
    puts "Options: " 
    $dail_book.sort.each { |k, v| puts format_city(k) } 
end