我的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_/) }
但它返回与上例相同的哈希值。是否有任何想法或建议将其作为平滑的一两个班轮?
答案 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