Reference keyword args inside method signatures
Ruby’s keyword arguments are pretty flexible to begin with, but I recently discovered you can reference previously set keyword arguments inside your method definition.
Here’s an example:
def query(type:, response_field: "#{type}_response")
response = run_query_against(type)
extract_payload(response, response_field)
end
query(type: "accounts") # Will set response_field to "accounts_response"
query(type: "foo", response_field: "bar") # Will use foo as type, and bar as response_field
From my experiments, it seems that each keyword argument has the scope of the previously defined keyword arguments available to it. This means that you cannot reference a keyword defined later in the signature, e.g.
def query(response_field: "#{type}_response", type: "accounts")
# This raises a NameError: undefined local variable or method `type'
end
The above will raise an exception, even if there is a default value supplied in the signature.
Tweet