我正在尝试使用collect!
修改哈希数组。对于每个哈希,我想添加1个新键/值并修改不同的键/值。但是,我在使用sub!
修改现有哈希值时遇到问题。它似乎完全用单个数组条目替换哈希值等于sub的结果!命令
paths = [{:path=>"bin/ruby/file1", :tag=>"v_10"}, {:path=>"usr/name/subdir/file2", :tag=>"v_12"}]
paths.collect! do |x|
x.merge(Hash[:file => x[:path].sub(/.*\//,"")]) # Grab file name
x[:path].sub!(/\/\w+$/,"") # remove file name from path
end
结果:
=> ["bin/ruby", "usr/name/subdir"]
期望的结果:
=> [{:path=>"bin/ruby", :tag=>"v_10", :file=>"file1"}, {:path=>"usr/name/subdir", :tag=>"v_12", :file=>"file2"}]
答案 0 :(得分:2)
您不希望collect!
,您需要each
。收集将输入哈希映射到每个块的输出,并且块的输出是.sub
调用的结果,这意味着您获得了变换的:path
值的平坦数组。
您也可以直接设置密钥:file
,而不是构建新的哈希并尝试合并它:
paths = [{:path=>"bin/ruby/file1", :tag=>"v_10"}, {:path=>"usr/name/subdir/file2", :tag=>"v_12"}]
paths.each do |x|
x[:file] = x[:path].sub(/.*\//, '')
x[:path].sub!(/\/\w+$/,"") # remove file name from path
end
puts paths.inspect # [{:path=>"bin/ruby", :tag=>"v_10", :file=>"file1"}, {:path=>"usr/name/subdir", :tag=>"v_12", :file=>"file2"}]
答案 1 :(得分:1)
功能样式版
paths.map do |path|
parts = path[:path].split('/');
{
:path => parts.first(parts.length - 1).join('/'),
:tag => path[:tag],
:file => parts.last
}
end