* [ruby-core:119331] [Ruby master Feature#20768] Add Hash#delete_at
@ 2024-09-28 21:08 seanpdoyle (Sean Doyle) via ruby-core
2024-10-01 18:27 ` [ruby-core:119388] " Eregon (Benoit Daloze) via ruby-core
0 siblings, 1 reply; 2+ messages in thread
From: seanpdoyle (Sean Doyle) via ruby-core @ 2024-09-28 21:08 UTC (permalink / raw)
To: ruby-core; +Cc: seanpdoyle (Sean Doyle)
Issue #20768 has been reported by seanpdoyle (Sean Doyle).
----------------------------------------
Feature #20768: Add Hash#delete_at
https://bugs.ruby-lang.org/issues/20768
* Author: seanpdoyle (Sean Doyle)
* Status: Open
----------------------------------------
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](https://docs.ruby-lang.org/en/3.3/Hash.html#method-i-values_at) and [Array#delete_at](https://docs.ruby-lang.org/en/3.3/Array.html#method-i-delete_at). It can pair nicely with multiple assignment to deconstruct a `Hash` instance:
```ruby
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:
```ruby
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`:
```ruby
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:
```ruby
hash => { a:, **hash }
a # => true
hash # => { b:false }
```
Finally, a block can be passed in the same style as [Hash#delete](https://docs.ruby-lang.org/en/3.3/Hash.html#method-i-delete) to provide a default value:
```ruby
attributes = { disabled: true, aria: { label: "label text" } }
aria, data = attributes.delete_at(:aria, :data) { Hash.new }
attributes # => { disabled: true }
aria # => { label: "label text" }
data # => {}
```
--
https://bugs.ruby-lang.org/
______________________________________________
ruby-core mailing list -- ruby-core@ml.ruby-lang.org
To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/
^ permalink raw reply [flat|nested] 2+ messages in thread
* [ruby-core:119388] [Ruby master Feature#20768] Add Hash#delete_at
2024-09-28 21:08 [ruby-core:119331] [Ruby master Feature#20768] Add Hash#delete_at seanpdoyle (Sean Doyle) via ruby-core
@ 2024-10-01 18:27 ` Eregon (Benoit Daloze) via ruby-core
0 siblings, 0 replies; 2+ messages in thread
From: Eregon (Benoit Daloze) via ruby-core @ 2024-10-01 18:27 UTC (permalink / raw)
To: ruby-core; +Cc: Eregon (Benoit Daloze)
Issue #20768 has been updated by Eregon (Benoit Daloze).
```ruby
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.
----------------------------------------
Feature #20768: Add Hash#delete_at
https://bugs.ruby-lang.org/issues/20768#change-110005
* Author: seanpdoyle (Sean Doyle)
* Status: Open
----------------------------------------
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](https://docs.ruby-lang.org/en/3.3/Hash.html#method-i-values_at) and [Array#delete_at](https://docs.ruby-lang.org/en/3.3/Array.html#method-i-delete_at). It can pair nicely with multiple assignment to deconstruct a `Hash` instance:
```ruby
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:
```ruby
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`:
```ruby
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:
```ruby
hash => { a:, **hash }
a # => true
hash # => { b:false }
```
Finally, a block can be passed in the same style as [Hash#delete](https://docs.ruby-lang.org/en/3.3/Hash.html#method-i-delete) to provide a default value:
```ruby
attributes = { disabled: true, aria: { label: "label text" } }
aria, data = attributes.delete_at(:aria, :data) { Hash.new }
attributes # => { disabled: true }
aria # => { label: "label text" }
data # => {}
```
--
https://bugs.ruby-lang.org/
______________________________________________
ruby-core mailing list -- ruby-core@ml.ruby-lang.org
To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2024-10-01 18:27 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-09-28 21:08 [ruby-core:119331] [Ruby master Feature#20768] Add Hash#delete_at seanpdoyle (Sean Doyle) via ruby-core
2024-10-01 18:27 ` [ruby-core:119388] " Eregon (Benoit Daloze) via ruby-core
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).