0

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

key1:val1
key2:val2
key3:val3

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

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

但我猜有一个更优雅的单线或两线。

4

3 回答 3

2

这是我的建议:

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

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

解释

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

  • 元素列表
  • 对列表
  • 可以转换为哈希的对象
于 2012-07-19T22:14:00.347 回答
1

如果您有成对的对象,那么Hash[]您的朋友就是:

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

妈的,太慢了……

于 2012-07-19T22:17:41.533 回答
0

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

hash = Hash[lines.split(/\s/).map {|line| line.split(':', 2)}]
于 2012-07-19T22:28:59.597 回答