2009-05-08 4 views
9

これを行うより良い方法はありますか?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

clunkinessの正確な味わいがDRYと呼ばれ、https://en.wikipedia.org/wiki/Don't_repeat_yourself。 –

答えて

8

わずかな修正、あなたの例では、文字列のキー持っていたので、:

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 }  

それとも、

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。最後のものは1.9のための新しいであり、それは代わりにstringsのあなたの鍵symbolsを作る)

を行うことができます(それは不格好に見えます)

キーと値はペアで発生するため、偶数のν議論の焦点。

+2

Ruby 1.9では、文字列ではなく記号であるキーでOKなら、{tid:tid、qid:qid}と言うこともできます。 – Chuck

+0

:動作しません、=>します – Schildmeijer

+0

いいえ、コロンは私が言ったように動作します。私はちょうどテストした。 ruby -e "tid = 12; puts({tid:tid})" print "{:tid => 12}"となります。 =>フォームは機能しません - それは{12 => 12}を出力します。 – Chuck

7

パフォーマンスが重要でない場合はこの1つが良くなります。

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

それらの名前は、実際のメソッドであれば、あなたがsendより高速でevalを置き換えることができます。

form_params[v] = send(v.to_sym) 

(更新)アンinjectを使用する代わりの(よりエレガントな)方法:

あなたは文字列リテラルではなく、あなたのための鍵などの記号が必要な場合は

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 } 

0

は私が美学のハッシュの不足に対処するためにMoreOpenStructというカスタムクラスを作成し、そのクラスを使用して、あなたの例は次のようになります。ハッシュを2回以上微調整する必要があります。

ハッシュを読みやすく/操作しやすいようにカスタムのstructクラスを使用していますが、すべてが割り当てであり、それを超えてハッシュを解析する必要がない場合は、Rogerのソリューションを使用します。

上記に
0

他のオプションでそれらの値を格納する構造体ベースのクラスを作成することです。例:

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

次に、form_paramsインスタンスをさまざまな方法で初期化することができます。

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

と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) })] 
関連する問題