填写Ruby哈希的更好方法是什么?

时间:2009-05-08 14:17:23

标签: ruby hash

有更好的方法吗? (看起来很笨重)

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

8 个答案:

答案 0 :(得分: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}

键和值成对出现,因此必须有偶数个参数。

答案 1 :(得分:9)

对上述内容略有修改,因为您的示例有字符串键:

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

答案 2 :(得分: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)

(更新)使用inject的另一种(更优雅)方式:

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

答案 3 :(得分:1)

另一种形式,对于红宝石1.9:

form_params = {tid: "tid", qid: "qid", ...}

答案 4 :(得分:1)

Hash[%w(tid qid pri sec to_u to_d from wl).collect{|x| [x,send(x)]}]

答案 5 :(得分:0)

我创建了一个名为MoreOpenStruct的自定义类来处理Hash缺乏美学,并且使用该类,您的示例将如下所示:

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 }

如果您需要字符串文字而不是符号作为哈希的关键,那么需要进行更多调整。

当我想要易于阅读/操作Hashes时,我使用我的自定义struct类,但如果你所做的只是一个赋值而不需要解析那个以外的哈希,我会使用Roger的解决方案。

答案 6 :(得分: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 ...

答案 7 :(得分:0)

a = %w(tid quid pri sec to_u to_d from wl)
form_params = Hash[a.zip(a.collect {|v| send(v) })]