Project

General

Profile

Actions

Bug #18633

closed

proc { |a, **kw| a } autosplats and treats empty kwargs specially

Added by Eregon (Benoit Daloze) about 2 years ago. Updated about 2 years ago.

Status:
Closed
Assignee:
-
Target version:
-
[ruby-core:107900]

Description

irb(main):005:0> proc { |a| a }.call([1, 2])
=> [1, 2]
irb(main):006:0> proc { |a, **kw| a }.call([1, 2])
=> 1 # should be [1, 2]
irb(main):007:0> proc { |a, kw: 42| a }.call([1, 2])
=> 1 # should be [1, 2]

What's the reason for proc { |a, **kw| a } to autosplat?
It seems inconsistent with the resolution of #16166, and it seems nobody would want that behavior (it loses arguments but the user extremely likely did not want that).
Could we change it so procs never autosplat, just like proc { |a| a }.

My understanding of the change in #16166 is to reflect the fact positional and kwargs are separated, and so adding **kw or kw: should never change anything if only positional arguments are passed.
This breaks in this case though.

Also I noticed:

irb(main):010:0> proc { |a, **kw| a }.call([1, 2])
=> 1
irb(main):011:0> proc { |a, **kw| a }.call([1, 2], **{})
=> [1, 2]

Which is really unfortunate as it shows a difference between passing **{} or nothing.
AFAIK passing **{} or nothing should always be equivalent, but it breaks in this case.

(from https://bugs.ruby-lang.org/issues/16166#note-14)

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0