class Hash # Returns a new hash with only the given keys. def slice(*keep_keys) h = {} keep_keys.each do |key| h[key] = fetch(key) end h end # Replaces hash with a new hash having only the given keys. # This return the hash of keys removed. def slice!(*keep_keys) removed = except(*keep_keys) replace(slice(*keep_keys)) removed end # Returns a new hash less the given keys. def except(*less_keys) slice(*keys - less_keys) end # Replaces hash with new hash less the given keys. # This returns the hash of keys removed. # # h = {:a=>1, :b=>2, :c=>3} # h.except!(:a) #=> {:a=>1} # h #=> {:b=>2,:c=>3} # def except!(*less_keys) removed = slice(*less_keys) replace(except(*less_keys)) removed end end