[ruby-core:88761] [Ruby trunk Feature#15049] [Request] Easily access all keyword arguments within a method

From: shevegen@...
Date: 2018-08-30 19:44:59 UTC
List: ruby-core #88761
Issue #15049 has been updated by shevegen (Robert A. Heiler).


I have had a somewhat related idea in that I wanted a way to access all
parameters in a simple, short manner. A bit similar to $1 $2 etc... for
regexes, just that we could do so programmatically for the arguments
passed into a method or a block. I was unable to come up with a short,
succinct and elegant way for this though so I gave up on the idea - but
I think introspection is great, so +1 for your idea (the idea itself;
not sure if kargs is a good name... won't people confuse that with
kwargs?).

----------------------------------------
Feature #15049: [Request] Easily access all keyword arguments within a method
https://bugs.ruby-lang.org/issues/15049#change-73810

* Author: bherms (Bradley Herman)
* Status: Open
* Priority: Normal
* Assignee: 
* Target version: 
----------------------------------------
As a developer, I'd like to leverage the power of keyword arguments (requirements, defaults, etc) and then be able to access a hash of all the arguments supplied.

~~~ ruby
def foo(bar:, baz: 1, qux: 2...)
  post('/', body: kargs)
end
~~~

This is currently possible by leveraging the RubyVM debug inspector and some meta programming to retrieve the binding and name of the calling method.  There is a gem https://github.com/banister/binding_of_caller that abstracts away the logic of crawling through the frame bindings in the debug inspector to find the binding of the caller, but I feel like this functionality would be useful in Ruby.

With the binding_of_caller gem, you can hack together a kargs method like so:

~~~ ruby
def kargs
  method(caller_locations(1,1)[0].label).parameters.map do |(_type, name)|
    [name, binding.of_caller(2).local_variable_get(name)]
  end.to_h
end
~~~

This gets the name of the calling method, pulls the local variables from the method, retrieves the binding, and then retrieves the variables from the binding.  By exposing a simpler API to retrieve the caller binding, a `kargs` method could be added to Ruby fairly easily I would think.





-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:[email protected]?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>

In This Thread

Prev Next