[ruby-core:96631] [Ruby master Bug#16473] New deprecated warning disallows keyword arguments bypassing
From:
merch-redmine@...
Date:
2020-01-02 17:31:15 UTC
List:
ruby-core #96631
Issue #16473 has been updated by jeremyevans0 (Jeremy Evans).
Status changed from Open to Rejected
This behavior is expected. The positional hash argument is converted to keyword arguments when `kw` is called. That is not going to work in Ruby 3 (see #14183), hence the warning.
For delegating argument to a method that accepts keywords, you should probably use `ruby2_keywords` (if you also need to support older ruby versions):
```ruby
ruby2_keywords :non_kw if respond_to?(:ruby2_keywords, true)
```
----------------------------------------
Bug #16473: New deprecated warning disallows keyword arguments bypassing
https://bugs.ruby-lang.org/issues/16473#change-83601
* Author: puchuu (Andrew Aladjev)
* Status: Rejected
* Priority: Normal
* Assignee:
* Target version:
* ruby -v: 2.7.0
* Backport: 2.5: UNKNOWN, 2.6: UNKNOWN
----------------------------------------
Hello. I see that ruby 2.7.0 prints unnecessary deprecated warning during arguments bypassing.
```ruby
def kw(a: 1)
puts "kw #{a}"
end
def non_kw(a = {}, *args)
puts "non kw #{a}"
kw *args
end
non_kw({ :a => 2 }, :a => 2)
non_kw({ :a => 3 })
non_kw
```
The right output is:
```
non kw {:a=>2}
kw 2
non kw {:a=>3}
kw 1
non kw {}
kw 1
```
Ruby 2.7.0 provides deprecated warning:
```ruby
warning: Using the last argument as keyword parameters is deprecated; maybe ** should be added to the call
```
`*args` is bypassing arguments without any conversion. It looks like ruby converts last hash to keywords and than converts it back to hash. I think it is a bug.
--
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>