如何从哈希中删除密钥并在Ruby / Rails中获取剩余的哈希值?

要添加一个新的哈希对我做:

{:a => 1, :b => 2}.merge!({:c => 3})   #=> {:a => 1, :b => 2, :c => 3}

有没有类似的方式从哈希中删除密钥?

这工作:

{:a => 1, :b => 2}.reject! { |k| k == :a }   #=> {:b => 2}

但我希望能有这样的东西:

{:a => 1, :b => 2}.delete!(:a)   #=> {:b => 2}

重要的是返回值将是剩余的散列值,所以我可以执行如下操作:

foo(my_hash.reject! { |k| k == my_key })

在一行中。


Rails除了/除了! 方法,该方法返回移除了这些键的散列。 如果你已经使用Rails,那么创建你自己的版本是没有意义的。

class Hash
  # Returns a hash that includes everything but the given keys.
  #   hash = { a: true, b: false, c: nil}
  #   hash.except(:c) # => { a: true, b: false}
  #   hash # => { a: true, b: false, c: nil}
  #
  # This is useful for limiting a set of parameters to everything but a few known toggles:
  #   @person.update(params[:person].except(:admin))
  def except(*keys)
    dup.except!(*keys)
  end

  # Replaces the hash without the given keys.
  #   hash = { a: true, b: false, c: nil}
  #   hash.except!(:c) # => { a: true, b: false}
  #   hash # => { a: true, b: false }
  def except!(*keys)
    keys.each { |key| delete(key) }
    self
  end
end

Oneliner平原红宝石,它只适用于红宝石> 1.9.x:

1.9.3p0 :002 > h = {:a => 1, :b => 2}
 => {:a=>1, :b=>2} 
1.9.3p0 :003 > h.tap { |hs| hs.delete(:a) }
 => {:b=>2} 

Tap方法总是返回被调用的对象...

否则,如果您需要active_support/core_ext/hash (这在每个Rails应用程序中都会自动需要),您可以根据需要使用以下方法之一:

➜  ~  irb
1.9.3p125 :001 > require 'active_support/core_ext/hash' => true 
1.9.3p125 :002 > h = {:a => 1, :b => 2, :c => 3}
 => {:a=>1, :b=>2, :c=>3} 
1.9.3p125 :003 > h.except(:a)
 => {:b=>2, :c=>3} 
1.9.3p125 :004 > h.slice(:a)
 => {:a=>1} 

除了使用黑名单方法之外,它将删除列出的所有键作为参数,而切片使用白名单方法,因此它将删除未作为参数列出的所有键。 还有那些方法的爆炸版本( except!slice! ),它们修改给定的散列,但是它们的返回值不同,它们都返回一个散列。 它代表slice!的删除键slice!except!保留的密钥except!

1.9.3p125 :011 > {:a => 1, :b => 2, :c => 3}.except!(:a)
 => {:b=>2, :c=>3} 
1.9.3p125 :012 > {:a => 1, :b => 2, :c => 3}.slice!(:a)
 => {:b=>2, :c=>3} 

为什么不使用:

hash.delete(key)
链接地址: http://www.djcxy.com/p/60951.html

上一篇: How to remove a key from Hash and get the remaining hash in Ruby/Rails?

下一篇: do..end vs curly braces for blocks in Ruby