Issue #18289 has been updated by usa (Usaku NAKAMURA).

Backport changed from 2.6: DONTNEED, 2.7: REQUIRED, 3.0: DONE to 2.6: DONTNEED, 2.7: DONE, 3.0: DONE

ruby_2_7 b1985629565c3c54b1a64d6faf213e8144857515 merged revision(s) e83c02a768af61cd0890a75e90bcae1119d8bd93.

----------------------------------------
Bug #18289: Enumerable#to_a should delegate keyword arguments to #each
https://bugs.ruby-lang.org/issues/18289#change-94883

* Author: Ethan (Ethan -)
* Status: Closed
* Priority: Normal
* ruby -v: ruby 3.0.2p107 (2021-07-07 revision 0db68f0233) [x86_64-linux]
* Backport: 2.6: DONTNEED, 2.7: DONE, 3.0: DONE
----------------------------------------
`Enumerable#to_a` has always delegated its arguments to `#each`, but it does not handle keyword arguments. This seems like an oversight.

My project uses keyword arguments to an #each method, and this has broken Enumerable#to_a as of ruby 3 (and generates a warning on ruby 2.7).


```ruby
class Foo
  include Enumerable

  def each(opt: )
    yield 'foo'
  end
end

pp Foo.new.to_a(opt: 4)
```

ruby 2.4

```
["foo"]
```

ruby 2.7

```
to_a_kw_arg_delegation.rb:8: warning: Using the last argument as keyword parameters is deprecated; maybe ** should be added to the call
to_a_kw_arg_delegation.rb:3: warning: The called method `each' is defined here
["foo"]
```

ruby 3

```
to_a_kw_arg_delegation.rb:3:in `each': wrong number of arguments (given 1, expected 0; required keyword: opt) (ArgumentError)
  from to_a_kw_arg_delegation.rb:8:in `to_a'
  from to_a_kw_arg_delegation.rb:8:in `<main>'
```


---Files--------------------------------
to_a_kw_arg_delegation.rb (101 Bytes)


-- 
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>