Oneliner plain ruby, funziona solo con ruby> 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}
Il metodo Tap restituisce sempre l'oggetto su cui viene invocato ...
Altrimenti, se richiesto active_support/core_ext/hash
(che è automaticamente richiesto in ogni applicazione Rails) è possibile utilizzare uno dei seguenti metodi a seconda delle esigenze:
➜ ~ 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}
tranne usa un approccio di blacklist, quindi rimuove tutte le chiavi elencate come args, mentre slice usa un approccio di whitelist, quindi rimuove tutte le chiavi che non sono elencate come argomenti. Esiste anche la versione bang di quel metodo ( except!
e slice!
) che modifica l'hash dato ma il loro valore di ritorno è diverso entrambi restituiscono un hash. Rappresenta le chiavi rimosse per slice!
e le chiavi conservate per 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}