2012-03-30 5 views
0

Ich verwende ein Array zum Speichern von Feldwerten. Um Elemente einfach hinzufügen und darauf zugreifen zu können, verwende ich Konstanten als Elementbezeichner.Wie erstelle ich Konstanten für den Zugriff auf Ruby-Array-Elemente?

Bis jetzt habe ich diese von Hand wie folgt aus:

stages = ["lidnummer","aardf","prest","dt_prest","aantal","bedrag","verstrekker","foutcode"] 
values = ["it","can","be","anything",0,5.3,nil,88] 
LIDNUMMER,AARDF,PREST,DT_PREST,AANTAL,BEDRAG,VERSTREKKER,FOUTCODE = 0,1,2,3,1,5,6,7 
p values[AARDF] => "can" 

Jetzt habe ich automatisiert dies wie:

stages = ["lidnummer","aardf","prest","dt_prest","aantal","bedrag","verstrekker","foutcode"] 
values = ["it","can","be","anything",0,5.3,nil,88] 
stages.each do |c| 
    eval "#{c.upcase} = #{stages.index(c)}" 
end 
p values[AARDF] => "can" 

Aber ich nehme an, es ist eine bessere Rubin-Weg, dies zu tun, und vielleicht ohne eval, gibt es Vorschläge?

+0

Magische Zahlen sind 'Symbol's in Rubin, so versuchen, Mach das mit ihnen. – Reactormonk

+0

bearbeitet die Werte Array es deutlicher zu machen, was ich – peter

Antwort

0

Vielen Dank, ich habe viel davon gelernt. Michael war am nächsten mit seiner Antwort, aber nicht richtig (die Werte-Array kann alles enthalten, normalerweise ist es nicht die Reihenfolge des Elements). Ich habe es geschafft, die verschiedenen hier vorgestellten Techniken zu kombinieren und habe folgendes entwickelt.

stages = ["lidnummer","aardf","prest","dt_prest","aantal","bedrag","verstrekker","foutcode"] 
values = ["it","can","be","anything",0,5.3,nil,88] 
stages.each_with_index{|c,i|Object::const_set(c.upcase, i)} 
p values[AARDF] => "it" 
p values[BEDRAG] => 5.3 

Wenn ich einen Hash verwenden ist es mehr Fehler empfindlich und ich würde am Ende

p values[hash["AARDF"]] 

mit denen nicht so glatt ist

+0

Bitte fügen Sie keine Antwort hinzu, es sei denn, es handelt sich um die ausgewählte Lösung für die ursprünglich von Ihnen gepostete Frage. Ändern Sie stattdessen Ihre ursprüngliche Frage und hängen Sie Ihre Informationen oben an. Das macht es für jemanden einfacher, Ihre Lösung zu finden, anstatt sie dazu zu zwingen, das gesamte Set zu durchsuchen. –

+0

Nun, Michael war der einzige, der in die Nähe kam, und ich korrigierte seine Antwort, um einen Fehler zu beheben, aber selbst nach der Korrektur denke ich, dass meine Lösung kürzer ist. Verzeiht mir, dass ich meine eigene Antwort als die beste Lösung akzeptiere mit etwas noch einfacherem oder kürzerem. – peter

1

Ja, verwenden Sie eine Hash und Symbol s.

stages = {:aardf => "aardf", :prest => "prest", ...} 
stages[:aardf] 

Für ältere, verwenden

AARDF = :aardf 

und

stages[AARDF] 

wird immer noch funktionieren.

+0

brauchte ich benutze Hashes für andere Fälle wie diese
Stufen = allready {: aardf => "aardf": PRest => "Prest"}
p Stufen [: aardf]
Aber manchmal ein Array ist besser..In diesem Fall muss ich sicher sein, dass keine Elemente hinzugefügt werden und dass die Elemente immer die gleiche Reihenfolge haben – peter

+0

Tass, ich redigierte meine Frage, um besser zu erklären, was ich brauche, werden Sie siehe, dass ein Hash hier nicht so glatt funktioniert stages = {: aardf => 1,: perst => 2} Werte = [0,1,2,3,4,5,6,7] p Werte [Stufen [: Aardf]] – peter

+0

Dann verwenden Sie r uby 1.9 und 'Hash' sind die Elemente dort geordnet. – Reactormonk

1

andere Art und Weise Sie Interesse bekommen kann -

stages = ["lidnummer","aardf","prest","dt_prest","aantal","bedrag","verstrekker","foutcode"] 
    values = [0,1,2,3,4,5,6,7] 

stages = stages.zip(values).inject({}) {|h, (k,v)| h[k.upcase]=v;h} 
=> {"LIDNUMMER"=>0, "FOUTCODE"=>7, "BEDRAG"=>5, "VERSTREKKER"=>6, "AANTAL"=>4, "PREST"=>2, "AARDF"=>1, "DT_PREST"=>3} 


p stages['AARDF'] #=> 1 
+0

danke, aber das ist nicht genug, tatsächlich gibt es zwei Arrays, eins mit den Feldnamen und eins mit den Werten, ich werde meine Frage bearbeiten, um diese besser zu zeigen – peter

+1

Simpler: 'Hash [stages.map (&: upcase). zip (Werte)] 'für die aktualisierte Frage oder' Hash [stages.map (&: upcase) .zip (Stufen)] 'für die ursprüngliche Frage. –

2

Dies ist die einfachste ich mir vorstellen kann, wenn Sie darauf bestehen, es den Weg auf dem Tun Sie beschrieben und nicht Hashes mit:

stages.zip(values) { |stage, value| Object.const_set(stage.upcase, value) } 
values[BEDRAG] #=> 5 

Persönlich ich baue einfach einen Hash, aber du kennst deine Anforderungen besser als ich:

Hash[stages.map(&:upcase).zip(values)] 
#=> {"LIDNUMMER"=>0, "AARDF"=>1, "PREST"=>2, "DT_PREST"=>3, "AANTAL"=>4, "BEDRAG"=>5, "VERSTREKKER"=>6, "FOUTCODE"=>7} 
+0

Gute Lösung und Verwendung von Reißverschluss! – joelparkerhenderson

+0

@michael was 'Werte [BEDRAG]' bedeuten für Sie .. ich kann immer 'BEDRAG' direkt zugreifen. –

+0

@SandipRansing Er kann den Wert auf etwas anderes "const_set" setzen, ich wollte nur OP eine idiomatische Art zeigen, das zu tun, was er wollte, und das ist es, wonach er fragt. –