[ruby-core:102909] [Ruby master Bug#17727] Unexpected syntax error when passing hash to **arg with kwarg
From:
merch-redmine@...
Date:
2021-03-17 20:35:11 UTC
List:
ruby-core #102909
Issue #17727 has been updated by jeremyevans0 (Jeremy Evans).
Status changed from Open to Rejected
Ruby syntax does not allow positional arguments after keyword arguments. `a: '1'` is a keyword argument and `{b: 1}` is a positional argument (`**{b: 1}` is a keyword argument, which is why that works). So the syntax errors are expected in this case, not a bug.
----------------------------------------
Bug #17727: Unexpected syntax error when passing hash to **arg with kwarg
https://bugs.ruby-lang.org/issues/17727#change-90972
* Author: colintherobot (Colin Hart)
* Status: Rejected
* Priority: Normal
* ruby -v: ruby 2.6.5p114 (2019-10-01 revision 67812) [x86_64-darwin19]
* Backport: 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: UNKNOWN
----------------------------------------
## Background
Given a method that takes a kwarg and a **positional_arg it throws an unexpected syntax error if you pass it an intact hash. This happens when you call the method, but also when you declare the method if it is multi-line.
``` ruby
def foo(a:, **b)
[a,b]
end
```
## Expectation
If you call this method without deconstructing the hash passed to the second argument first I would expect a message indicating that you need to deconstruct the hash first.
## Steps to reproduce
Instead it throws a syntax error:
``` ruby
foo(a: '1', {b: 2})
SyntaxError: unexpected ')', expecting =>
foo(a: '1', {b: 2})
^
```
Passing case when you deconstruct the hash first:
``` ruby
foo(a: '1', **{b: 2})
=> ["1", {:b=>2}]
```
But wondering if there's something else going on because you get a different error when defining this case on multiple lines. If you're trying to run this in a repl environment it won't even let you complete the method call.
from repl:
``` ruby
foo(
a: '1',
{b: 2}
SyntaxError: unexpected '\n', expecting =>
```
passing case:
``` ruby
foo(
a: '1',
**{b:1}
)
=> ["1", {:b=>1}]
```
Attached is a ruby script to reproduce the above cases.
---Files--------------------------------
kwarg_bug.rb (291 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>