Project

General

Profile

Actions

Feature #20768

open

Add Hash#delete_at

Added by seanpdoyle (Sean Doyle) 3 months ago. Updated 3 months ago.

Status:
Open
Assignee:
-
Target version:
-
[ruby-core:119331]

Description

Add Hash#delete_at to delete values from a list keyed by its arguments.

The interface and return values draw inspiration from Hash#values_at and Array#delete_at. It can pair nicely with multiple assignment to deconstruct a Hash instance:

hash = { a: true, b: false }
a, c = hash.delete_at(:a, :c) # => [ true, nil ]
hash # => { b: false }

Similar outcomes can be achieved with rightward assignment:

hash = { a: true, b: false }
hash => { a:, **rest }
a # => true
rest # => { b: false }

However, rightward assignment will raise an error when a key is missing, whereas Hash#delete_at could return nil or the Hash#default_value:

hash => { c: } # => raises NoMatchingPatternKeyError

Similarly, rightward assignment does not mutate the original Hash instance. In some circumstances, this is beneficial. However, others that require mutation would involve re-assigning the variable:

hash => { a:, **hash }
a # => true
hash # => { b:false }

Finally, a block can be passed in the same style as Hash#delete to provide a default value:

attributes = { disabled: true, aria: { label: "label text" } }
aria, data = attributes.delete_at(:aria, :data) { Hash.new }
attributes # => { disabled: true }
aria # => { label: "label text" }
data # => {}

Updated by Eregon (Benoit Daloze) 3 months ago

a, c = [:a, :c].map { hash.delete(it) }

seems enough and does not require adding a new method for what looks like (to me) a narrow use case.

Actions

Also available in: Atom PDF

Like0
Like0