Ruby修改并在哈希数组中添加哈希值

时间:2014-02-24 00:23:40

标签: ruby

我正在尝试使用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"}]

2 个答案:

答案 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