Чтобы добавить новую пару в Hash, я делаю:
{:a => 1, :b => 2}.merge!({:c => 3}) #=> {:a => 1, :b => 2, :c => 3}
Есть ли аналогичный способ удалить ключ из Hash?
Это работает:
{: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 })
в одну строку.
ruby-on-rails
ruby
ruby-on-rails-3
hashmap
ruby-hash
Миша Морошко
источник
источник
Ответы:
Rails имеет исключение / исключение! метод, который возвращает хэш с удаленными этими ключами. Если вы уже используете Rails, нет смысла создавать собственную версию этого.
источник
require "active_support/core_ext/hash/except"
Простой рубин, он работает только с ruby> 1.9.x:
Метод Tap всегда возвращает объект, для которого вызывается ...
В противном случае, если вам нужно
active_support/core_ext/hash
(что автоматически требуется в каждом приложении Rails), вы можете использовать один из следующих методов в зависимости от ваших потребностей:кроме того, использует подход черного списка, поэтому он удаляет все ключи, перечисленные как аргументы, в то время как slice использует подход белого списка, поэтому он удаляет все ключи, которые не перечислены в качестве аргументов. Существует также версия взрыва тех методов (
except!
иslice!
), которые модифицируют данный хеш, но их возвращаемое значение отличается, они оба возвращают хеш. Он представляет удаленные ключи дляslice!
и ключи, которые хранятся дляexcept!
:источник
h
.Hash#except
не будет изменять исходный хеш.h.dup.tap { |hs| hs.delete(:a) }
чтобы избежать изменения исходного хэша.Почему бы просто не использовать:
источник
merge
,merge!
,delete
, но нетdetele!
...foo(hash.delete(key) || hash)
delete
он не изменял свой параметр, и если бы онdelete!
существовал и изменял его параметр.Есть много способов удалить ключ из хэша и получить оставшийся хэш в Ruby.
.slice
=> Он вернет выбранные ключи и не удалит их из исходного хэша. Используйте,slice!
если вы хотите удалить ключи навсегда, иначе используйте простойslice
..delete
=> Он удалит выбранные ключи из исходного хэша (он может принять только один ключ и не более одного)..except
=> Он вернет оставшиеся ключи, но не удалит ничего из исходного хеша. Используйте,except!
если вы хотите удалить ключи навсегда, иначе используйте простойexcept
..delete_if
=> В случае, если вам нужно удалить ключ на основе значения. Очевидно, он удалит соответствующие ключи из исходного хэша..compact
=> Используется для удаления всехnil
значений из хеша. Используйте,compact!
если вы хотите удалитьnil
значения навсегда, иначе используйте simplecompact
.Результаты на основе Ruby 2.2.2.
источник
slice
иexcept
добавляются с помощьюActiveSupport::CoreExtensions::Hash
. Они не являются частью ядра Ruby. Они могут быть использованыrequire 'active_support/core_ext/hash'
Hash#slice
есть в стандартной библиотеке. ruby-doc.org/core-2.5.0/Hash.html#method-i-slice Yay!Если вы хотите использовать чистый Ruby (без Rails), не хотите создавать методы расширения (возможно, вам это нужно только в одном или двух местах, и вы не хотите загрязнять пространство имен множеством методов) и не хотите отредактируйте хеш (то есть, вы поклонник функционального программирования, такого как я), вы можете «выбрать»:
источник
Я настроил это так, что .remove возвращает копию хэша с удаленными ключами при удалении! изменяет сам хэш Это соответствует рубиновым соглашениям. например, из консоли
источник
Вы можете использовать
except!
изfacets
драгоценного камня:Оригинальный хеш не меняется.
РЕДАКТИРОВАТЬ: как говорит Рассел, аспекты имеют некоторые скрытые проблемы и не полностью API-совместимы с ActiveSupport. С другой стороны ActiveSupport не так полон, как аспекты. В конце концов, я бы использовал AS и предоставил крайние случаи в вашем коде.
источник
require 'facets/hash/except'
и у них нет «проблем» (не уверен, какие проблемы у них будут в любом случае, кроме 100% AS API). Если вы делаете Rails-проект с использованием AS, имеет смысл, если нет, Facets занимает гораздо меньше места.Вместо того, чтобы вносить исправления в обезьяны или без необходимости включать большие библиотеки, вы можете использовать уточнения, если вы используете Ruby 2 :
Вы можете использовать эту функцию, не затрагивая другие части вашей программы или не включая большие внешние библиотеки.
источник
в чистом рубине
источник
См. Ruby on Rails: Удалить несколько ключей хеша
источник
each
вернул бы массив.Было бы здорово, если delete вернул пару удаления хэша. Я делаю это:
источник
Это однострочный способ сделать это, но он не очень читабелен. Рекомендуем использовать две строки вместо.
источник
Hash#except
иHash#except!
уже упоминалось достаточно.Proc.new
Версия не очень читаемая , как вы говорите , а также более сложные , чемuse_remaining_hash_for_something(begin hash.delete(:key); hash end)
. Может быть, просто удалите этот ответ.Несколько способов удалить Key in Hash. Вы можете использовать любой метод снизу
Есть много способов, вы можете посмотреть на Ruby doc of Hash здесь .
Спасибо
источник
Это также будет работать:
hash[hey] = nil
источник