添加一对新的哈希,我做:
{: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有一个except/except!方法,该方法返回删除了这些键后的散列。如果您已经在使用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
Hash#except (Ruby 3.0+)
从Ruby 3.0开始,hash# except是一个内置方法。
因此,不再需要依赖ActiveSupport或编写monkey-patches来使用它。
h = { a: 1, b: 2, c: 3 }
p h.except(:a) #=> {:b=>2, :c=>3}
来源:
除了官方Ruby文档。
链接到PR。
Ruby 3.0增加了Hash#except和ENV.except。
在哈希中删除键的多种方法。
你可以使用下面的任何方法
hash = {a: 1, b: 2, c: 3}
hash.except!(:a) # Will remove *a* and return HASH
hash # Output :- {b: 2, c: 3}
hash = {a: 1, b: 2, c: 3}
hash.delete(:a) # will remove *a* and return 1 if *a* not present than return nil
有很多方法,你可以看看Ruby doc of Hash。
谢谢你!