Issue #19370 has been updated by mame (Yusuke Endoh).
We discussed this issue and #19983 at the dev meeting.
* Only method arguments can be delegated by `foo(*)`.
* It should raise a SyntaxError to use `foo(*)` in a block that accepts `*` explicitly.
* It is allowed to use `foo(*)` in a block that does not accept `*` explicitly.
```ruby
def m(*)
->(*) { p(*) } # SyntaxError
->(x, *) { p(*) } # SyntaxError
->(x) { p(*) } #=> 1
proc {|x| p(*) } #=> 1
end
m(1).call(2)
```
The main discussion was as follows.
* `def m(*); ->(*) { p(*) }; end` is indeed confusing.
* We want to prohibit a case where takes `*` and `**` from different blocks, such as
`->(&) { ->(**) { ->(*) { foo(*, **, &) } }`.
* We want to allow `def m(*) = @mutex.synchronize { m2(*) }` enclosed in a block that does
not accept `*`. So we cannot prohibit to take arguments from outer blocks (or the method
arguments).
* Should we allow to take block arguments in unambiguous cases, such as `def m; ->(*) {
p(*) }; end` ?
* @knu: In many cases, what we want to delegate is the method arguments.
* @ko1: Once we prohibit it, we can allow the delegation of block arguments later, if it
is really needed.
----------------------------------------
Feature #19370: Anonymous parameters for blocks?
https://bugs.ruby-lang.org/issues/19370#change-105217
* Author: zverok (Victor Shepelev)
* Status: Assigned
* Priority: Normal
* Assignee: matz (Yukihiro Matsumoto)
----------------------------------------
Just to clarify: are anonymous parameters delegation is planned to support in blocks?
It would be a nice addition, if it is possible to implement:
```ruby
# data in form [request method, URL, params]:
[
[:get, 'https://google.com', {q: 'Ruby'}, {'User-Argent':
'Google-Chrome'}],
[:post, 'https://gist.github.com', 'body'],
# ...
].each { |method, *| request(method.to_s.upcase, *) }
```
...and at the very least, consistent with what the method definition can have.
If they are NOT planned to be implemented, I believe that at least error messages should
be made much clearer, because currently, this would happen while running the code above:
no anonymous rest parameter (SyntaxError)
I understand the reason (the `request` clause doesn't "see" anonymous
parameter of the **block**, and claims that current **method** doesn't have them), but
it looks honestly confusing and inconsistent.
--
https://bugs.ruby-lang.org/