Feature #15822

Add Hash#except

Added by timoschilling (Timo Schilling) about 1 year ago. Updated 21 days ago.

Target version:


According to Hash#slice, I would like to add Hash#except. Same for ENV.except.


hash-except.patch (4.05 KB) hash-except.patch timoschilling (Timo Schilling), 05/06/2019 06:26 PM

Related issues

Related to Ruby master - Feature #13563: Implement Hash#choice method.ClosedActions
Is duplicate of Ruby master - Feature #8499: Importing Hash#slice, Hash#slice!, Hash#except, and Hash#except! from ActiveSupportClosedmatz (Yukihiro Matsumoto)Actions

Updated by nobu (Nobuyoshi Nakada) about 1 year ago

  • Is duplicate of Feature #8499: Importing Hash#slice, Hash#slice!, Hash#except, and Hash#except! from ActiveSupport added

Updated by timoschilling (Timo Schilling) about 1 year ago

  • File deleted (hash-except.patch)

Updated by matz (Yukihiro Matsumoto) 9 months ago

Updated by matz (Yukihiro Matsumoto) 9 months ago

Hash#slice was introduced via discussion in #13563. We didn't see the need for Hash#except yet. Any (real world use-case)?
I don't think the name except is the best name for the behavior.


Updated by zverok (Victor Shepelev) 9 months ago

matz (Yukihiro Matsumoto) About use-cases, there are multiple, like:

  • Logging/debug printing some hash with sensitive or too large data excluded:
  puts "REQUEST: #{request_data.except(:body, :apikey)}
  • Data tidying:'data.csv', headers: true).map(&:to_h).map { |row|"Manager comment")) }
  • Data conversion: { |para| }

...and so on (without even mentioning working with models in Rails, where it is used extensively to, for example, copy model without its id and timestamps).
Redmine's sources, for example, make some use of it:

$ grep -F ".except(" {app,lib} -r | wc -l

I recently stumbled upon it, too.

About the name: I understand "ActiveSupport uses this name" is kinda lazy one, but it does :) And, TBH, for me (even before I started working with Rails, I used Ruby for first my 12 years without ActiveSupport) it always felt natural: request.except(:path, :body) requires no further explanations. Facets uses the name, too.

The alternative method name I can think of is, maybe, descriptive without_keys(*keys) (or except_keys, or just without(*keys)), but I am not sure it is any better.

Updated by matz (Yukihiro Matsumoto) 21 days ago

You have provided the use-case, and I understand the need. It's tempting the name exclude but except is OK too.



Updated by timoschilling (Timo Schilling) 21 days ago

  • Status changed from Open to Closed

Applied in changeset git|82ca8c73034b0a522fd2970ea39edfcd801955fe.

Add Hash#except ENV#except [Feature #15822]

Also available in: Atom PDF