2012-07-19 70 views
0

下面是另一个“在Ruby中执行X的最优雅方式”类型的问题。考虑从与主要web服务的响应:在回体的每一行值对,一路上我想创建一个Ruby散列与此数据,{"key1" => "val1", ...}使用键创建Ruby散列:值行

key1:val1 
key2:val2 
key3:val3 

线。在算法上,我可以的git的“er与

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

这样做,但我猜有一个一行或两班轮这是更优雅。

+0

http://www.ruby-doc.org/core-1.9.3/Hash.html – 2012-07-19 22:18:31

回答

2

这里是我的建议:

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

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

说明

Hash[object]从创建该对象的新的哈希。当对象是一个:

  • 元素的列表对
  • 列表
  • 对象,可以被转换成散列
+0

这工作就像一个魅力,什么是Hash []语法的解释?我对此并不熟悉。 – Joe 2012-07-19 22:18:54

+1

'它'不是一个特别有意义的名字,为什么不简单地'行'?还要注意'split(':',2)'会允许冒号。 – tokland 2012-07-19 22:19:45

+0

不知道我在哪里获得这种习惯。可能来自groovy。对我来说,它只是代表:)或迭代器。 – Yossi 2012-07-19 22:23:33

1

,如果你有对象对,比Hash[]是你的朋友:

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

该死的,太慢了...

0

有在后插入符号的回报,所以真正的话题的解决方案是

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