2016-12-22 4 views
-2

Ok ich verstehe, was ist lokale Variable und was ist globale Variable, aber ich habe in diese Übung 40 auf learnruythethaway für extra Kredit, wo sie jede Methode auf Hash zu tun fragen.Raise Undefined lokale Variable oder Methode

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

#Adding a new kay with a new value 
$cities["NY"] = "New York" 
$cities["OR"] = "Portland" 


def loop(map,state) 

    $cities.each do |map,state| 
     if map.include? state 
      return map[state] 

     else 
      return "Not found." 
     end 
    end 
end 

$cities[:find] = method(:loop) 

    while true 

     print "State? (Enter to quit) " 
     state = gets.chomp 

     break if state.empty? 

     #This line is the most important ever! study! 
     puts $cities[:find].call(cities,state) 
    end 

Der Fehler ist immer mich nicht definiert lokale Variable oder Methode geben ‚Städte‘

Wie dem auch sei, was ich über lokale Variable zu verstehen ist, dass Sie die in der Hauptdatei zugreifen kann, aber wenn es um die globale Variable Sie können ihm $ zuweisen und von der Methode in ihm selbst zugreifen.

Ich habe Forschung über andere undefinierte Variable oder Methode, aber ihre ist ziemlich geradlinig.

+0

Suresh, können Sie einen Link zu der Frage bereitstellen? Dann denke ich, dass jemand Ihnen zeigen kann, wie man diesem Problem den _Ruby Way_ nähert. –

+0

@ sagarpandya82 der Link ist http://media.thebirn.com/webteam/LearnRubyTheHardWay.pdf, Seite 115 unter extra Kredit – Suresh

Antwort

2

Diese Linie ist Ihr Problem:

puts $cities[:find].call(cities,state) 

Es gibt keine lokale Variable cities in Umfang, damit der Fehler auf.

Um ehrlich zu sein finde ich das ganze Beispiel extrem künstlich und ziemlich schrecklich. Die Zeiten, in denen ich tatsächlich globale Variablen in den letzten 10+ Jahren benötigt habe, um Ruby zu schreiben, können an den Fingern einer Hand gezählt werden, wobei einige übrig bleiben.

Da Sie scheinen durch globale und lokale Variablen verwechselt werden, haben einen Blick auf diese:

$foo = "foo" 
defined?($foo) 
#=> "global-variable" 
defined?(foo) 
#=> nil 

Dies ist, was mit $cities und cities (man beachte die fehlende $) in Ihrem Beispiel passiert.

+0

Warum brauchen lokale Variable, wenn ich Städte als $ Städte zuweisen, wo Sie trotzdem zugreifen können Sie mögen? – Suresh

+0

Ich habe keine Ahnung, was dieser Satz bedeuten soll, aber Sie versuchen auf eine lokale Variable ("cities") zuzugreifen, die nicht existiert. Die einzige ähnlich benannte Variable, die Sie definiert haben, ist die globale $ cities. –

+0

@Suresh Ich habe ein anschauliches Beispiel für Sie hinzugefügt. –

Verwandte Themen