2016-09-29 5 views
0

-CodeEntire Hash immer am Ende der Schleife zurück

$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 

Ausgabe

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 

Frage

Warum wird die gesamte Hash am Ende wieder bekommen der Schleife? Was ist los?

+1

verwenden nur 'map' statt' each'. Siehe Dokumentation. – Ilya

+1

Sie können 'format_cities' entfernen und' puts $ dail_book.keys.map {| citie | hinzufügen citie.split ('_'). map (&: Großbuchstaben) .join ('')} .sort' –

Antwort

1

Die Methode gibt das ursprüngliche aufzählbare Objekt zurück, auf das sie aufgerufen wurde. Deshalb behalten Sie nach dem Ende der Schleife den gesamten Hash-Wert puts bei.

1

Du puts zweimal im Code aufrufen:

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

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

Versuchen Sie, Ihre Methoden konzentriert zu halten und modular aufgebaut. display_cities offensichtlich zeigt etwas, so wird puts hier erwartet. format_cities konvertiert dagegen einen Wert. Es sollte nichts gedruckt werden.

Futhermore, sein Name (..._cities, Plural) legt nahe, dass es auf einmal mehrere Städte formatiert, während es nur formatiert eine Stadt zu einer Zeit. Es sollte daher format_city (Singular) aufgerufen werden:

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

Dann bewegen Sie den Druckteil in das Display ein verwandtes Verfahren. Doch statt des Druckens das Ergebnis each (die die Sammlung zurückgibt), bewegen putsin die Schleife jedes formatiert Ortsnamen drucken:

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