2009-05-08 13 views
9

Czy jest lepszy sposób to zrobić? (Wygląda niezgrabne)Lepszy sposób na wypełnienie mieszania ruby?

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

Dokładna smak clunkiness nazywa DRY, https://en.wikipedia.org/wiki/Don't_repeat_yourself. –

Odpowiedz

8

niewielkie modyfikacje do powyższego, ponieważ Twój przykład miał klucze wyrażenie:

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 }  

Albo można zrobić

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} 

(NB. Ostatnia jest nowy dla 1,9 i to sprawia, że ​​klucz symbols zamiast strings)

{tid: tid, qid: qid}

Klucze i wartości występują w parach, więc musi być nawet nu szał argumentów.

+2

Jeśli chodzi o Ruby 1.9, jeśli jesteś w porządku z kluczami będącymi symbolami, a nie z łańcuchami, możesz również powiedzieć {tid: tid, qid: qid}. – Chuck

+0

: nie działa, => robi – Schildmeijer

+0

Nie, dwukropek działa tak jak powiedziałem. Właśnie testowałem. ruby -e "tid = 12; puts ({tid: tid})" drukuje "{: tid => 12}". Formularz => nie działa - drukuje {12 => 12}. – Chuck

7

Jeżeli wydajność nie jest ważny ten może wyglądać lepiej:

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

Jeśli te nazwy są faktycznie metod można wymienić eval przez szybszego send:

form_params[v] = send(v.to_sym) 

(aktualizacja) An alternatywa (i bardziej elegancki) sposób korzystania inject:

form_params = ['tid', 'qid', 'pri', 'sec', 'to_u', 'to_d', 'from', 'wl'].inject({}) { |h, v| h[v] = send(v); h } 
0

stworzyłem niestandardowej klasy o nazwie MoreOpenStruct do czynienia z brakiem hash za estetyki i stosując tę ​​klasę, Twój przykład wyglądałby następująco:

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 } 

Jeśli potrzebujesz literały ciągów zamiast symboli jak kluczem do hasz następnie wymagane są dodatkowe poprawki.

Używam mojej niestandardowej klasy struct, kiedy chcę łatwo czytać/manipulować hashesem, ale jeśli wszystko, co robisz, jest zadaniem i nie musisz analizować hasha poza tym, użyłbym rozwiązania Rogera.

0

Inne opcje byłoby utworzyć klasę Struct opartego na przechowywanie tych wartości. Na przykład:

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

Wtedy byłbyś w stanie zainicjować instancję form_params w różny sposób:

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

I jeszcze inna forma, 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) })] 
Powiązane problemy