【问题标题】:Ruby modify and add a hash value in array of hashesRuby 修改并在哈希数组中添加一个哈希值
【发布时间】:2014-02-24 00:23:39
【问题描述】:

我正在尝试使用collect! 修改哈希数组。对于每个哈希,我想添加 1 个新键/值并修改不同的键/值。但是,我在使用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"}]

【问题讨论】:

    标签: ruby


    【解决方案1】:

    你不想要collect!,你想要each。 Collect 将输入哈希映射到每个块的输出,块的输出是您的 .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"}]
    

    【讨论】:

    • collect! 不是collectcollect 本来可以(用merge! 而不是merge)但有点无意义
    • @muistooshort 任何一个选项都是错误的,他从块中返回一个值,x[:path].sub!(/\/\w+$/,"")
    • meagar,感谢您解释我的代码为什么不起作用+答案。我的印象是我们无法使用each 就地修改(这就是我尝试使用collect 的原因)。创建x[:file] 在这里如何工作?是因为数组条目指向 Hash 并且该指针实际上并没有改变(所以each 有效)?
    • 您正在对对象数组进行迭代,每次迭代都将x 设置为数组中的下一个对象。在 Ruby 中对象是按值赋值的,所以修改 x 会修改 x 指向的对象。当您想保持数组的原始版本不变时,使用collect 并没有错,但您需要返回全新的对象,否则两个数组都将包含对 same 对象的引用。跨度>
    • 块的返回值完全相关的唯一原因是他使用了collect!,如果他使用collect,那么块的返回值将无关紧要。您的答案仍然有错字,因为您的第一句话没有意义。
    【解决方案2】:

    功能样式版本

    paths.map do |path| 
      parts = path[:path].split('/'); 
      { 
        :path => parts.first(parts.length - 1).join('/'), 
        :tag => path[:tag], 
        :file => parts.last
      }
    end
    

    【讨论】:

      猜你喜欢
      • 2013-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-17
      • 2021-02-05
      • 1970-01-01
      • 2020-10-09
      • 1970-01-01
      相关资源
      最近更新 更多