使用键:值行创建Ruby哈希

时间:2012-07-19 22:03:48

标签: ruby parsing hashtable

这是另一个“在Ruby中做X最优雅的方式”类型的问题。考虑来自Web服务的响应,其中返回主体的每一行上的键:值对沿着

key1:val1
key2:val2
key3:val3

我想用这个数据{"key1" => "val1", ...}创建一个Ruby哈希。从算法上讲,我可以完成

hash = {}
body.lines.each do |line|
  key, val = line.split(':')
  hash[key] = val
end

但我猜测有一个单线或双线更优雅。

3 个答案:

答案 0 :(得分:2)

这是我的建议:

lines = [
  'key1:val1',
  'key2:val2',
  'key3:val3'
]

hash = Hash[lines.map {|it| it.split(':', 2)}]

<强>解释

Hash[object]从对象创建一个新哈希。对象是以下之一:

  • 元素列表
  • 对名单
  • 可以转换为哈希的对象

答案 1 :(得分:1)

如果您有一对对象,则Hash[]是您的朋友:

Hash[lines.map {|key_val| key_val.split(":")}]
=> {"key1"=>"val1", "key2"=>"val2", "key3"=>"val3"} 
该死的,太慢......

答案 2 :(得分:0)

帖子中有插入符号,所以真正的主题解决方案是

hash = Hash[lines.split(/\s/).map {|line| line.split(':', 2)}]