2009-05-08 19 views
9

Gibt es einen besseren Weg, dies zu tun? (Es sieht klobig)Bessere Möglichkeit, einen Ruby-Hash zu füllen?

form_params = {} 
form_params['tid'] = tid 
form_params['qid'] = qid 
form_params['pri'] = pri 
form_params['sec'] = sec 
form_params['to_u'] = to_u 
form_params['to_d'] = to_d 
form_params['from'] = from 
form_params['wl'] = wl 
+0

Die genaue Geschmack von clunkiness trocken genannt, https://en.wikipedia.org/wiki/Don't_repeat_yourself. –

Antwort

8

leichte Modifikation des oben, da Ihr Beispiel String-Schlüssel hatte:

form_params = {} 
%w(tid qid pri sec to_u to_d from wl).each{|v| form_params[v] = send(v)} 
20
form_params = { "tid" => tid, "qid" => qid }  

Oder könnten Sie

form_params = Hash["tid", tid, "qid", qid]  #=> {"tid"=>tid, "qid"=>qid} 
form_params = Hash["tid" => tid, "qid" => qid] #=> {"tid"=>tid, "qid"=>qid} 
form_params = Hash[tid => tid, qid => qid]  #=> {"tid"=>tid, "qid"=>qid} 

tun (nb. Die letzte ist neu für 1.9 und es macht Ihre Schlüssel symbols statt strings)

{tid: tid, qid: qid}

Schlüssel und Werte treten paarweise auf, daher muss ein geradzahliger Wert angegeben werden mehrere Argumente.

+2

Ab Ruby 1.9, wenn Sie mit den Schlüsseln keine Zeichenfolgen, sondern Symbole sind, können Sie auch {tid: tid, qid: qid} sagen. – Chuck

+0

: funktioniert nicht, => tut – Schildmeijer

+0

Nein, der Doppelpunkt funktioniert genauso wie ich es gesagt habe. Ich habe es gerade getestet. ruby -e "tid = 12; puts ({tid: tid})" druckt "{: tid => 12}". Das => Formular funktioniert nicht - es druckt {12 => 12}. – Chuck

7

Wenn die Leistung nicht wichtig ist, diese könnte man besser aussehen:

form_params = {} 
['tid', 'qid', 'pri', 'sec', 'to_u', 'to_d', 'from', 'wl'].each do |v| 
    form_params[v] = eval(v) 
end 

Wenn diese Namen tatsächlich Methoden sind Sie eval durch die schnellere send ersetzen:

form_params[v] = send(v.to_sym) 

(Update) Ein alternative (und elegantere) Weise unter Verwendung inject:

0

ich eine benutzerdefinierte Klasse erstellt MoreOpenStruct genannt mit Hash Mangel an Ästhetik zu tun, und die Verwendung dieser Klasse, würde Ihr Beispiel wie folgt aussehen:

form_params = MoreOpenStruct.new 
form_params.tid = tid 
form_params.qid = qid 
form_params.pri = pri 
form_params.sec = sec 
form_params.to_u = to_u 
form_params.to_d = to_d 
form_params.from = from 
form_params.wl = wl 

form_params_hash = form_params._to_hash 
    #=> { :tid => tid, :qid => qid, etc } 

Wenn Sie Stringliterale müssen anstatt Symbole wie der Schlüssel zu Ihrem Hash sind dann noch ein paar Optimierungen nötig.

Ich benutze meine benutzerdefinierte struct-Klasse, wenn ich Hashes einfach lesen/bearbeiten möchte, aber wenn alles, was Sie tun, eine Aufgabe ist und den Hash nicht weiter analysieren muss, würde ich Rogers Lösung verwenden.

0

Die anderen Optionen eine Struct Basis-Klasse zu erstellen wären in diesen Wert zu speichern. Zum Beispiel:

FormParams = Struct.new(:tid, :qid, :pri, :sec, :to_u, :to_d, :from, :wl) 

Dann würden Sie in der Lage sein, die form_params Instanz in einer Vielzahl von Möglichkeiten zur Initialisierung:

form_params = FormParams.new(:tid => tid, :qid => qid, # etc ... 
form_params = FormParams.new(tid, qid, pri, sec, to_u, to_d, from, wl) 
form_params = FormParams.new 
form_params.tid = tid 
form_params.gid = gid 
# etc ... 
1

Und noch eine andere Form, für Ruby 1.9:

form_params = {tid: "tid", qid: "qid", ...} 
1
Hash[%w(tid qid pri sec to_u to_d from wl).collect{|x| [x,send(x)]}] 
0
a = %w(tid quid pri sec to_u to_d from wl) 
form_params = Hash[a.zip(a.collect {|v| send(v) })] 
Verwandte Themen