Project

General

Profile

Feature #15822

Add Hash#except

Added by timoschilling (Timo Schilling) 7 months ago. Updated about 2 months ago.

Status:
Open
Priority:
Normal
Assignee:
-
Target version:
-
[ruby-core:92538]

Description

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


Files

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 ActiveSupportClosedActions

History

#1

Updated by nobu (Nobuyoshi Nakada) 7 months ago

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

Updated by timoschilling (Timo Schilling) 7 months ago

  • File deleted (hash-except.patch)
#4

Updated by matz (Yukihiro Matsumoto) about 2 months ago

Updated by matz (Yukihiro Matsumoto) about 2 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.

Matz.

Updated by zverok (Victor Shepelev) about 2 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:
  CSV.read('data.csv', headers: true).map(&:to_h).map { |row| OpenStruct.new(row.except("Manager comment")) }
  • Data conversion:
  paragraphs.map { |para| ParaStats.new(para.to_h.except(:text)) }

...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
27

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.

Also available in: Atom PDF