From: "mame (Yusuke Endoh) via ruby-core" Date: 2023-11-08T01:35:09+00:00 Subject: [ruby-core:115299] [Ruby master Feature#19370] Anonymous parameters for blocks? 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/ ______________________________________________ ruby-core mailing list -- ruby-core@ml.ruby-lang.org To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org ruby-core info -- https://ml.ruby-lang.org/mailman3/postorius/lists/ruby-core.ml.ruby-lang.org/