Project

General

Profile

Feature #15049

[Request] Easily access all keyword arguments within a method

Added by bherms (Bradley Herman) about 2 years ago. Updated about 2 years ago.

Status:
Feedback
Priority:
Normal
Assignee:
-
Target version:
-
[ruby-core:88760]

Description

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.

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:

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.

Also available in: Atom PDF