引数を渡す方法
概要
位置パラメータとキーワードパラメータの任意の組み合わせを別のメソッドに渡すメソッドを作成できますか?
このバージョンは、すべての場合に動作するとは限りません。
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