[ruby-core:124385] [Ruby Feature#21813] Add [:forward, :...] symbol tuple to indicate forwarding arguments when calling `Method#parameters`
Issue #21813 has been reported by pabloh (Pablo Herrero). ---------------------------------------- Feature #21813: Add [:forward, :...] symbol tuple to indicate forwarding arguments when calling `Method#parameters` https://bugs.ruby-lang.org/issues/21813 * Author: pabloh (Pablo Herrero) * Status: Open ---------------------------------------- When accessing `Method#parameters` for a method using forwarding parameters, an unexpected behavior arises: ``` def foo(*, **, &) "puts(#{(method(__method__).parameters.dig(0,1))})" # Fails! end def foo(...) "puts(#{(method(__method__).parameters.dig(0,1))})" # Works fine end ``` It's very strange that you can't access the parameters, on `eval`, using the symbols provided at `Method#parameters`. Adding `[:forward, :...]` or `[:forwarding, :...]` for those cases feels simply natural. -- https://bugs.ruby-lang.org/
Issue #21813 has been updated by nobu (Nobuyoshi Nakada). `foo(a: 1)` doesn't print what you expect, I guess. ---------------------------------------- Feature #21813: Add [:forward, :...] symbol tuple to indicate forwarding arguments when calling `Method#parameters` https://bugs.ruby-lang.org/issues/21813#change-116057 * Author: pabloh (Pablo Herrero) * Status: Open ---------------------------------------- When accessing `Method#parameters` for a method using forwarding parameters, an unexpected behavior arises: ```ruby def foo(*, **, &) binding.eval "print(#{(method(__method__).parameters.dig(0,1))})" # Works fine end foo(1,2,3,4) # => 1234 def bar(...) binding.eval "print(#{(method(__method__).parameters.dig(0,1))})" # Fails! end bar(1,2,3,3) # SyntaxError ``` It's very strange that you can't access the parameters, on `eval`, using the symbols provided at `Method#parameters`. Adding `[:forward, :...]` or `[:forwarding, :...]` for those cases feels simply natural. -- https://bugs.ruby-lang.org/
Issue #21813 has been updated by pabloh (Pablo Herrero). @nobu Perhaps I came up with a contrived example, but I wanted to point out that there is a lack of symmetry when it comes to `....`. As of right now, there is no way to know from the `Method` class API alone whether a method is using argument forwarding. You’d have to use Method#source_location and then parse the source file somehow. ---------------------------------------- Feature #21813: Add [:forward, :...] symbol tuple to indicate forwarding arguments when calling `Method#parameters` https://bugs.ruby-lang.org/issues/21813#change-116085 * Author: pabloh (Pablo Herrero) * Status: Open ---------------------------------------- When accessing `Method#parameters` for a method using forwarding parameters, an unexpected behavior arises: ```ruby def foo(*, **, &) binding.eval "print(#{(method(__method__).parameters.dig(0,1))})" # Works fine end foo(1,2,3,4) # => 1234 def bar(...) binding.eval "print(#{(method(__method__).parameters.dig(0,1))})" # Fails! end bar(1,2,3,3) # SyntaxError ``` It's very strange that you can't access the parameters, on `eval`, using the symbols provided at `Method#parameters`. Adding `[:forward, :...]` or `[:forwarding, :...]` for those cases feels simply natural. -- https://bugs.ruby-lang.org/
Issue #21813 has been updated by matz (Yukihiro Matsumoto). Status changed from Open to Rejected I failed to persuade me. I admit there's a lack of symmetry, but I don't think it's not worth the potential performance burden. Matz. ---------------------------------------- Feature #21813: Add [:forward, :...] symbol tuple to indicate forwarding arguments when calling `Method#parameters` https://bugs.ruby-lang.org/issues/21813#change-116395 * Author: pabloh (Pablo Herrero) * Status: Rejected ---------------------------------------- When accessing `Method#parameters` for a method using forwarding parameters, an unexpected behavior arises: ```ruby def foo(*, **, &) args = method(__method__).parameters.map(&:last).join(',') binding.eval "print(#{args})" # Works fine end foo(1,2,3,4, a: 23) # => 1234{a: 23} def bar(...) args = method(__method__).parameters.map(&:last).join(',') binding.eval "print(#{args})" # Fails! end bar(1,2,3,3, a: 23) # SyntaxError ``` It's very strange that you can't access the parameters, on `eval`, using the symbols provided at `Method#parameters`. Adding `[:forward, :...]` or `[:forwarding, :...]` for those cases feels simply natural. -- https://bugs.ruby-lang.org/
participants (3)
-
matz (Yukihiro Matsumoto) -
nobu (Nobuyoshi Nakada) -
pabloh (Pablo Herrero)