Oneliner звичайний рубін, він працює лише з рубіном> 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}
Метод Tap завжди повертає об'єкт, на який викликається ...
В іншому випадку, якщо вам потрібно active_support/core_ext/hash
(що автоматично вимагається в кожній програмі Rails), ви можете використовувати один із наведених нижче способів залежно від ваших потреб:
➜ ~ 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}
за винятком використовує підхід у чорному списку, тому він видаляє всі ключі, перелічені як аргументи, тоді як фрагмент використовує білий підхід, тому він видаляє всі ключі, які не вказані як аргументи. Існує також версія bang того методу ( except!
і slice!
), який модифікує даний хеш, але їх повернене значення різне, вони обидва повертають хеш. Він представляє видалені ключі для slice!
та ключі, які зберігаються для 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}