Can I create method that passes any combination of position and keyword parameters to another method?
This version not working in all cases:
def proxy(*args, **keywords)
send(yield, *args, **keywords)
end
def foo1(param)
puts 'foo1', param
end
def foo2(params:)
puts 'foo2', params
end
def foo3(param, params:)
puts 'foo3', param, params
end
def foo4()
puts 'foo4'
end
proxy('param') { 'foo1' } #1
proxy(params: 'params') { 'foo2' } #2
proxy('param', params: 'params') { 'foo3' } #3
proxy { 'foo4' } #4
#2 and #3 are working.
#1 raises wrong number of arguments (given 2, expected 1) (ArgumentError)
#4 raises wrong number of arguments (given 1, expected 0) (ArgumentError)
You can try:
def proxy(*args)
send(yield, *args)
end
[24] pry(main)> proxy('param') { 'foo1' } #1
foo1
param
=> nil
[25] pry(main)> proxy(params: 'params') { 'foo2' } #2
foo2
params
=> nil
[26] pry(main)> proxy('param', params: 'params') { 'foo3' } #3
foo3
param
params
=> nil
[27] pry(main)> proxy { 'foo4' } #4
foo4