ruby - 只选择那些有值的可选命名参数的明智方法

标签 ruby

我正在为某个第三方应用程序 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做?在这种情况下,可选的是 ae

最佳答案

如果您使用的是 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/

相关文章:

ruby-on-rails - 在 Rails 3 中将现有的 has_many 关系更改为多态

ruby-on-rails - 废弃整个 API 还是严重依赖它?

ruby - 添加两个 ActiveRecord::Relation 对象

ruby - 我如何处理(或阻止)来自 ruby​​ 反引号调用的 SIGCHLD 信号?

ruby-on-rails - Rvm 和 gems,bundle show 和 gem 列表

ruby - 在简单的 Sinatra 应用程序中了解 ruby​​ 多线程

arrays - 删除存在于另一个数组中的数组元素

javascript - 使用 JS 中的 SJCL 和 Ruby 中的 OpenSSL 的椭圆曲线加密

ruby - 调试 Ruby erb 文件有哪些技巧?

ruby-on-rails - 架构arm64构建nokogiri-xmlsec-instruct的 undefined symbol Ruby gem