Project

General

Profile

Actions

Feature #16115

open

Keyword arguments from method calls or ignore extra hash keys in splat

Added by kke (Kimmo Lehto) over 5 years ago. Updated over 5 years ago.

Status:
Open
Assignee:
-
Target version:
-
[ruby-core:94480]

Description

Just a thought, feel free to insta-close as stupid.

Currently you can do this:

def hello(who:)
  puts "Hello, #{who}"
end

opts = { who: 'world' }
hello(who)

Or:

def hello(who:, **_extra_opts) # without eating extra args, you get ArgumentError (unknown keyword: foo)
  puts "Hello, #{who}!"
end

hello(**{ who: 'world', foo: 'bar' })

Or even this:

def hello(_obj = nil, who: _obj&.who || raise(ArgumentError, "missing who:"))
  puts "Hello, #{who}!"
end

hello(OpenStruct.new(who: 'world'))
  1. What if when you passed an object as an argument to a method that only accepts keyword arguments, the methods listed would be called? Then you could do:
require 'ostruct'
ostruct = OpenStruct.new(who: 'world, foo: 'bar')

def hello(who:)
  puts "Hello, #{who}!"
end

hello(ostruct)
  1. Or perhaps add some sort of "triple splat" that would either a) do the method calling thing described above or b) do the regular hash splatting like ** but ignore any keys present that are not listed as keyword arguments:
require 'ostruct'
ostruct = OpenStruct.new(who: 'world', foo: 'bar')

def hello(who:)
  puts "Hello, #{who}!"
end

# a:  
hello(***ostruct)  # would call ostruct.who to figure out `who:`

# or b: (currently with ** raises ArgumentError (unknown keyword: foo))
hello(***{ who: 'world', foo: 'bar' }) # would ignore any extra keys 

I think this could open up some possibilities (or a can of worms).

Actions

Also available in: Atom PDF

Like0
Like0Like0