如何从散列中选择键,并使用ruby去除键名的部分

时间:2015-07-26 20:05:25

标签: ruby regex hash

我的ruby项目中有一个配置哈希,我想选择带有值的某些键,将它们作为一个单独的哈希值。

Project.config.to_h.select{ |k,v| k[/db_/] }
=> {:db_name => value, .... }

这很好地回报了我需要的所有k,v。但我也想从键名中删除db_以便它返回我

=> {:name => value, ....}

我试过像

这样的东西
Project.config.to_h.select{ |k,v| k[/db_/] }.each_key { |k| k.to_s.gsub(/db_/) }

但它返回与上例相同的哈希值。是否有任何想法或建议将其作为平滑的一两个班轮?

2 个答案:

答案 0 :(得分:0)

inject拯救(假设db_在开头):

Project.config.to_h.inject({}) do | a, (k, v) |
  k =~ /\Adb_/ ? a.update($' => v) : a
end

inject可用于迭代可枚举的数据结构,并在课程中构建任何类型的输出。

$'是一个神奇的变量,包含成功的正则表达式匹配后字符串的一部分。

答案 1 :(得分:0)

所以,让我们分解你的解决方案,看看它有什么问题:

Project.config.to_h.select{ |k,v| k[/db_/] }.each_key { |k| k.to_s.gsub(/db_/) }

所以:

k.to_s.gsub(/db_/)

正在创建一个新对象(而不是像你期望的那样改变键),在这种情况下是一个枚举器,当你没有传递gsub第二个参数时它返回一个枚举器,所以让我们假设你做了:

k.to_s.gsub(/db_/, "")

这将创建新对象,而不是改变散列中的键(to_s将创建一个新的字符串对象,而gsub不会改变,而是创建一个新对象,{{1是突变版本)

现在让我们假设键是字符串,你甚至可以改变它们(使用gsub!),ruby不会让你在适当位置改变它们,否则当一个字符串被用作键时,ruby hash会被破坏它是gsub!,请参阅http://ruby-doc.org/core-2.2.2/Hash.html#5B-5D-3D-method

  

key在作为键使用时不应更改其值(作为键传递的未冻结的String将被复​​制并冻结)。

因此,有了这些知识,我将如何实现这一点:

frozen