Search code examples
ruby

How to pass through arguments


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)


Solution

  • 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