在Ruby中将特定字符串映射到哈希的最有效方法

在Ruby中将特定字符串映射到哈希的最有效方法,ruby,Ruby,我是Ruby新手,正在开发一个CLI应用程序,它可以解析我的一些报告。我想找出最有效的方法来实现以下目标: MAXCONN: 2000, MAXSSL_CONN: 500, PLAINCONN: 34, AVAILCONN: 1966, IDLECONN: 28, SSLCONN: 0, AVAILSSL: 500 我想相应地将其映射为哈希: { :maxconn => 2000, :maxssl_conn => 500, :plainconn => 34, :availco

我是Ruby新手,正在开发一个CLI应用程序,它可以解析我的一些报告。我想找出最有效的方法来实现以下目标:

MAXCONN: 2000, MAXSSL_CONN: 500, PLAINCONN: 34, AVAILCONN: 1966, IDLECONN: 28, SSLCONN: 0, AVAILSSL: 500
我想相应地将其映射为哈希:

{ :maxconn => 2000, :maxssl_conn => 500, :plainconn => 34, :availconn => 1966, :idleconn => 28, :sslconn => 0, :availssl => 500 }
我能想到的唯一方法是在逗号处拆分,然后在分号处再次拆分并映射它们

我有一种隐秘的怀疑,也许有一些Ruby魔法可以以更高效、更少麻烦的方式实现这一点

任何输入和/或技巧/提示都将不胜感激,因为我有一种感觉,我会比较频繁地处理类似的问题

hash = {}
input.scan /(\w)+\:(\d+)\,/ do |key, val|
  hash[key.downcase.to_sym] = val.to_i
end 
似乎是最明显的

您可以这样做(有一些警告):

但这真的迫使一艘客轮在它不应该在的地方

当然,这不是一个可怕的想法:

hash = input.split(",").each_with_object({}) do |str, h| 
  k,v = str.split(":")
  h[k.downcase.to_sym] = v.to_i
end

我们结合了将一组键值对转换为散列的技术

Hash[[[k1, v1], [k2, v2], ...]] #=> { k1 => v1, k2 => v2, ... }
使用正则表达式方法
String#scan
,它通过字符串并在数组中收集匹配项,以获得

Hash[reports.scan(/(\w+): (\w+)/).map { |(first, second)| [first.downcase.to_sym, second.to_i] }]
这还使用了一个带有
可枚举#map
的块,该块将数组解释为参数列表中的
(第一、第二)
元素对,将这些元素提取到新元素中,并对它们应用转换,以便根据示例的规范定制生成的哈希(否则,只会得到映射到字符串的字符串哈希).

首先编写代码,然后对其进行优化 如果您的代码导致Ruby实现出现瓶颈,那么您首先要做的就是确定是字符串拆分还是哈希创建,还是将新哈希添加到它所在的任何数组中(这是我最担心的步骤!),这是导致瓶颈的原因

编写函数式编程风格的代码——通常更干净,有时更快 关于将新哈希添加到它所在的数组,通常不应该这样做

array_of_hashes = []
lines.each do |line|
  hash = create_hash(line)
  array_of_hashes << hash
end

后者通常性能更好,但不管怎样,它是更干净的代码,因此它不是过早的优化。

如果使用ruby1.9,甚至不需要解析该文本,因为ruby1.9在键是符号时接受格式为
{symbol:value}
的哈希文本。简单地说,这样做:

eval("{#{your_string.downcase}}")

这是完美的,解释得很好。谢谢你的详细解释:)!
array_of_hashes = lines.map do |line|
  hash = create_hash(line)
  hash
end
eval("{#{your_string.downcase}}")