Oneliner plain ruby, il ne fonctionne qu'avec un rubis> 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}
La méthode Tap renvoie toujours l'objet sur lequel est invoqué ...
Sinon, si vous en avez besoin active_support/core_ext/hash
(ce qui est automatiquement requis dans chaque application Rails), vous pouvez utiliser l'une des méthodes suivantes en fonction de vos besoins:
➜ ~ 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}
sauf qu'il utilise une approche de liste noire, il supprime donc toutes les clés répertoriées comme arguments, tandis que slice utilise une approche de liste blanche, il supprime donc toutes les clés qui ne sont pas répertoriées comme arguments. Il existe également la version bang de ces méthodes ( except!
et slice!
) qui modifient le hachage donné mais leur valeur de retour est différente les deux retournent un hachage. Il représente les clés supprimées slice!
et les clés conservées pour 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}