2012-07-19 82 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)}]