From: eregontp@... Date: 2020-09-18T19:53:48+00:00 Subject: [ruby-core:100040] [Ruby master Bug#17178] Procs with kw:def/**kw lose elements when called with a single Array Issue #17178 has been updated by Eregon (Benoit Daloze). Is there a reason that keywords in procs cause autosplatting? It seems counter-intuitive. I would expect autosplatting depends on declared positional parameters only. I'd argue it's a bug, because we lose part of the arguments for seemingly no reason. Also keyword extension is supposed to be safe, right? Here it loses part of the arguments, which seems rather severe to me: `proc { |a| p [a] }.call([1,2,3]) # => [[1, 2, 3]]` `proc { |a, **kw| p [a,kw] }.call([1,2,3]) # => [1, {}]` (where are `2` and `3`??) `proc { |a,| p [a] }.call([1,2,3]) # => [1]` this is OK, I'm explicitly discarding extra arguments. ---------------------------------------- Bug #17178: Procs with kw:def/**kw lose elements when called with a single Array https://bugs.ruby-lang.org/issues/17178#change-87590 * Author: Eregon (Benoit Daloze) * Status: Open * Priority: Normal * ruby -v: ruby 3.0.0dev (2020-09-18T09:12:58Z master e1cca08a6d) [x86_64-linux] * Backport: 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN ---------------------------------------- ``` $ ruby -ve '{a: 1}.each_pair { |a, kw: :def| p [a,kw] }' ruby 3.0.0dev (2020-09-18T09:12:58Z master e1cca08a6d) [x86_64-linux] [:a, :def] # bug, should be [[1, 2], :def] $ ruby -ve '{a: 1}.each_pair { |a, **kw| p [a,kw] }' ruby 3.0.0dev (2020-09-18T09:12:58Z master e1cca08a6d) [x86_64-linux] [:a, {}] # bug, should be [[1, 2], {}] ``` So the value of the key-value pair is lost and not assigned to any argument. This seems a general problem of Proc, not just #each_pair: ``` $ ruby -e 'proc { |a, kw: :def| p [a,kw] }.call(1,2)' [1, :def] # understandable $ ruby -e 'proc { |a, kw: :def| p [a,kw] }.call([1,2])' [1, :def] # bug, should be [[1, 2], :def] $ ruby -e 'proc { |a, **kw| p [a,kw] }.call(1,2)' [1, {}] # understandable $ ruby -e 'proc { |a, **kw| p [a,kw] }.call([1,2])' [1, {}] # bug, should be [[1, 2], {}] ``` -- https://bugs.ruby-lang.org/ Unsubscribe: