From: eregontp@... Date: 2021-07-15T15:49:57+00:00 Subject: [ruby-core:104621] [Ruby master Bug#18011] `Method#parameters` is incorrect for forwarded arguments Issue #18011 has been updated by Eregon (Benoit Daloze). nobu (Nobuyoshi Nakada) wrote in #note-10: > `Method#ruby2_keywords?` may be needed, I guess. It's possible to detect like `method.parameters.include?([:keyrest, :**])`. I'm not sure how RBS represents delegation. The previous `(*untyped)` seems incorrect, while the actual result `(*untyped, **untyped)` seems better for Ruby 3+. ---------------------------------------- Bug #18011: `Method#parameters` is incorrect for forwarded arguments https://bugs.ruby-lang.org/issues/18011#change-92914 * Author: josh.cheek (Josh Cheek) * Status: Open * Priority: Normal * ruby -v: ruby 3.0.1p64 (2021-04-05 revision 0fb782ee38) [arm64-darwin20] * Backport: 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: UNKNOWN ---------------------------------------- When asking a method about its parameters, forwarded arguments say they are a rest and a block (`wrapper1` in the example below). However, when we use that signature, it raises an ArgumentError (`wrapper2` in the example below). When I add a keyrest to the signature, it works as expected (`wrapper3` in the example below). So I think forwarded arguments should include a keyrest in the output of `Method#parameters` ```ruby def wrapped(ord, kw:) = [ord, {kw: kw}] methods = [ def wrapper1(...) = wrapped(...), def wrapper2(*r, &b) = wrapped(*r, &b), def wrapper3(*r, **k, &b) = wrapped(*r, **k, &b), ] methods.each do |name| puts File.read(__FILE__)[/#{name}\(.*?\)/] puts " params: #{method(name).parameters.inspect}" puts " result: #{(method(name).call 123, kw: 456 rescue $!).inspect}" puts end ``` Output: ``` wrapper1(...) params: [[:rest, :*], [:block, :&]] result: [123, {:kw=>456}] wrapper2(*r, &b) params: [[:rest, :r], [:block, :b]] result: # wrapper3(*r, **k, &b) params: [[:rest, :r], [:keyrest, :k], [:block, :b]] result: [123, {:kw=>456}] ``` -- https://bugs.ruby-lang.org/ Unsubscribe: