From: "jeremyevans0 (Jeremy Evans)" <noreply@...>
Date: 2022-03-04T01:50:27+00:00
Subject: [ruby-core:107770] [Ruby master Misc#18609] keyword decomposition in enumerable (question/guidance)

Issue #18609 has been updated by jeremyevans0 (Jeremy Evans).


If you don't want to change too much code, you can define your own method like this if you want to automatically keyword splat:

```ruby
module Enumerable
  def each_kw
    each{|v| yield(**v)}
  end
end

drafts.each_kw do |name: , mod: , image: | 
 # ...
end
```

----------------------------------------
Misc #18609: keyword decomposition in enumerable (question/guidance)
https://bugs.ruby-lang.org/issues/18609#change-96691

* Author: Ethan (Ethan -)
* Status: Open
* Priority: Normal
----------------------------------------
There is a pattern that I have used somewhat often in ruby 2, decomposing hash keys as keyword arguments to blocks for Enumerable, which no longer works in ruby 3. I'm wondering if there is a better way that I am missing (I couldn't find any discussion of this particular thing searching this tracker).

```ruby
drafts = [
  {name: 'draft4', mod: :Draft04, image: 'draft4.png'},
  {name: 'draft6', mod: :Draft06, image: 'draft6.jpg'},
]

# ruby 2
drafts.each do |name: , mod: , image: |
  ...

# ruby 3
drafts.each do |draft|
  name = draft[:name]
  mod = draft[:mod]
  image = draft[:image]
  ...
```

the latter is much more cumbersome, but seems necessary with the switch in keyword argument handling in ruby 3.

I can refactor to `name, mod, image = draft[:name], draft[:mod], draft[:image]`. that is a little better but still more verbose and repetitive than it used to be, and with more keys the line gets very long.

I am expecting this pattern is just a casualty of the keyword split that I will have to rewrite and this issue can be closed, but hoping there may be some better option I have missed.




-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>