我正在为某个第三方应用程序 A 构建客户端。我有许多方法接受一堆参数,其中一些是可选的。我正在使用命名参数:
def func1(a: nil, b:, c:, d:, e: nil)
# ...............
call_to_client_internal(a: a, b: b, c: c.....)
end
第三方应用不接受nil
的参数。也就是说,每个参数要么必须有一个值,要么不能被传递。
有没有办法检查传递给 func1
的可选参数是否有值,并且只传递这些参数进一步传递给 call_to_client_internal
做?在这种情况下,可选的是 a
和 e
。
最佳答案
如果您使用的是 Ruby 2.1 +,则有一种方法可以做到:
def foo(a: nil, b:nil, c: nil, d: nil, e: nil)
present_args = method(__method__).parameters.select { |arg| binding.local_variable_get(arg[1]) }
...
end
这个:
- 使用
method(:foo).parameters
获取可用的参数 - 使用
binding.local_variable_get(arg[1])
获取它们的值 - 根据需要选择这些使用,存储在
present_args
中(我相信你能想到一个更好的名字
因此,对于您的情况,我将其扩展为使用 reduce
:
def func1(a: nil, b:nil, c: nil, d: nil, e: nil)
present_args_hash = method(__method__).parameters.reduce({}) do |hash, (_, arg)|
next hash unless (val = binding.local_variable_get(arg))
hash.merge(arg => val)
end
call_to_client_internal(present_args_hash)
end
这看起来是一种很好的直接方法 - 您只构建那些存在的关键字参数的散列,并将其发送给您的客户。
告诉我你过得怎么样!有任何问题,很乐意提供帮助。
关于ruby - 只选择那些有值的可选命名参数的明智方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48560049/