【问题标题】:What is an idiomatic way to update hash keys in Ruby?在 Ruby 中更新哈希键的惯用方法是什么?
【发布时间】:2013-11-07 17:47:01
【问题描述】:

在遍历哈希时,无法更改键。假设您要为每个键添加“_new”:

hash = { 'a' => 1, 'b' => 2 }

new_pairs = Hash.new

hash.each do | k,v |
  new_pairs[ k + '_new' ] = v

  hash.delete k
end

hash.merge! new_pairs

有没有一种更干净、更惯用的类似 ruby​​ 的方式来做到这一点?

【问题讨论】:

    标签: ruby hash iterator refactoring enumerable


    【解决方案1】:

    您不需要就地突变 (merge!)。我会做这样的事情:

    hash = { 'a' => 1, 'b' => 2 }
    
    hash2 = Hash[hash.map{|k, v| [k + '_new', v] }]
    
    hash2 # => {"a_new"=>1, "b_new"=>2}
    

    【讨论】:

    • @BSeven:是的,没错。
    【解决方案2】:

    您不能在修改哈希时直接迭代它,但您可以迭代 keys

    hash.keys.each{|k| hash["#{k}_new"] = hash.delete(k)}
    

    【讨论】:

    • 在筛选我可能会在您的解决方案中使用的各种形容词时,我选择了“可爱”。 (很好。)
    • 是的,非常可爱。
    【解决方案3】:

    任君挑选!

        hash = hash.keys.reduce({}) {|h,k| h[k + '_new'] = hash[k]; h}   
    

    【讨论】:

      【解决方案4】:
      hash.map { |k, v| {"#{k}_new" => v} }.reduce(:merge)
      

      【讨论】:

        【解决方案5】:

        我会这样做:

        hash = { 'a' => 1, 'b' => 2 }
        nw_hash = Hash.new { |hsh, key| hsh[key+'_new'] = hash[key] }
        hash.keys.each{|e| nw_hash[e] }
        nw_hash
        # => {"a_new"=>1, "b_new"=>2}
        

        【讨论】:

          猜你喜欢
          • 2015-09-10
          • 1970-01-01
          • 2010-10-21
          • 2020-03-11
          • 1970-01-01
          • 1970-01-01
          • 2013-12-06
          • 2015-09-15
          • 1970-01-01
          相关资源
          最近更新 更多