From: "Eregon (Benoit Daloze)" Date: 2022-03-04T12:55:54+00:00 Subject: [ruby-core:107775] [Ruby master Misc#18609] keyword decomposition in enumerable (question/guidance) Issue #18609 has been updated by Eregon (Benoit Daloze). Status changed from Open to Closed Hanmac (Hans Mackowiak) wrote in #note-3: > interesting, it seems to be changed in between "3.1.0" and "3.1.1" This is not true, AFAIK this behavior on purpose since Ruby 3.0.0. Also please don't claim something like that without a concrete example and result. Concretely: ``` $ ruby -ve '[{a: 1}].each { |a:| p a }' ruby 2.7.5p203 (2021-11-24 revision f69aeb8314) [x86_64-linux] -e:1: warning: Using the last argument as keyword parameters is deprecated; maybe ** should be added to the call -e:1: warning: The called method is defined here 1 ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x86_64-linux] -e:1:in `block in
': missing keyword: :a (ArgumentError) ruby 3.1.0p0 (2021-12-25 revision fb4df44d16) [x86_64-linux] -e:1:in `block in
': missing keyword: :a (ArgumentError) ruby 3.1.1p18 (2022-02-18 revision 53f5fc4236) [x86_64-linux] -e:1:in `block in
': missing keyword: :a (ArgumentError) ruby 3.2.0dev (2022-03-03T08:56:31Z master c1790f8c11) [x86_64-linux] -e:1:in `block in
': missing keyword: :a (ArgumentError) ``` What @jeremyevans0 said is the way, let's close. ---------------------------------------- Misc #18609: keyword decomposition in enumerable (question/guidance) https://bugs.ruby-lang.org/issues/18609#change-96696 * Author: Ethan (Ethan -) * Status: Closed * 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: