Techioz Blog

引数を渡す方法

概要

位置パラメータとキーワードパラメータの任意の組み合わせを別のメソッドに渡すメソッドを作成できますか?

このバージョンは、すべての場合に動作するとは限りません。

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と#3は動作しています。

#1 は間違った数の引数を生成します (2 が指定され、1 が予期されます) (ArgumentError)

#4 は間違った数の引数を生成します (1 が指定され、0 が期待されます) (ArgumentError)

解決策

あなたが試すことができます:

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