2009-05-08 3 views
9

Есть ли лучший способ сделать это? (Выглядит неуклюжим)Лучший способ заполнить хеш-рубин?

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 называется СУХОЙ, 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, и это делает ваш ключ symbols вместо strings)

{tid: tid, qid: qid}

Ключи и значения встречаются парами, поэтому должно быть четное nu аргумент.

+2

Начиная с Ruby 1.9, если вы в порядке с клавишами, являющимися символами, а не строками, вы также можете сказать {tid: tid, qid: qid}. – Chuck

+0

: не работает, => – Schildmeijer

+0

Нет, двоеточие работает так же, как я сказал. Я просто испытал. ruby -e "tid = 12; puts ({tid: tid})" prints "{: tid => 12}". Форма => не работает - она ​​печатает {12 => 12}. – Chuck

7

Если производительность не важна эта одна может выглядеть лучше:

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

Если эти имена на самом деле методы, которые вы можете заменить eval более быстрым send:

form_params[v] = send(v.to_sym) 

(Update) An альтернативный (и более элегантный) способ с использованием inject:

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

Я создал пользовательский класс под названием MoreOpenStruct, чтобы иметь дело с отсутствием хеш-функции в эстетике, и с помощью этого класса, ваш пример будет выглядеть так:

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

Другие варианты были бы создать класс, основанного на Struct для хранения этих значений в. Например:

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

И еще одна форма, рубина 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) })] 
Смежные вопросы