2016-06-11 5 views
0

Ich bin ein wenig verwirrt über einen Teil dieses Codes. In Zeile 7 habe ich unten kommentiert.Ruby: Verwirrt darüber, wie man diesen Code sinnvoll macht

01:states_file = File.open("states_abbrev.txt") 
02:states = {} 
03:while ! states_file.eof? 
04:  first = states_file.gets.chomp 
05:  #"ALABAMA,AL" 
06:  data = first.split(",") 
07:  states[ data[0] ] = data[1] #This line here. 
08:end 
09:puts states.inspect 
10: 
11:states_file.close 

Zeile 5 ist und Beispiel für jede Zeile wie in der states_abbrev.txt-Datei. Nur ein Zustand, ein Komma, eine Abkürzung und eine Wagenrückgabe. Alle 50 Zustände sind in der Datei.

Wie Sie Daten auf der Leitung 7 die Daten [0] Schlüssel überschrieben zu werden scheint [1] sehen können. Also warum ist es, wenn ich diesen Code ausführen Daten [0] ist immer noch der Schlüssel, und Daten [1] wird der Wert?

Antwort

1

nach Zeile 6

data [0] ist, Alabama, data [1] ist AL

nach Zeile 7

Zustände { 'ALABAMA' => 'AL'}

Es werden keine Daten [0] überschrieben. Daten [0] sind der Schlüssel und Daten [1] sind der Wert.

Eine gute Sache, die Sie versuchen können, ist Rubys irb

1

Nein, es ist nicht die data[0], die von überschrieben wird. Es ist der Hash states, der (der Name eines Staates ist) für den Schlüssel data[0] (der der Abkürzungsteil der Zeile ist) festgelegt wird.

Vielleicht ist es leichter zu verstehen, wenn Sie mehr Variablen oder besser Namen einführen:

file = File.open("states_abbrev.txt") 
states = {} 

while !file.eof? 
    line = file.gets.chomp 
    name, abbr = line.split(",") 
    states[abbr] = name 
end 

file.close 

Btw: Ich würde wahrscheinlich so etwas schreiben:

File.open('states_abbrev.txt') do |file| 
    file.each_line.map { |line| line.chomp.split(',').reverse }.to_h 
end 
+0

Ich hatte eine harte Zeit, schlang meine Kopf um es herum. Jetzt denke ich, dass ich das Konzept verstanden habe. Vielen Dank. – Drew