Ruby:如何将方法的所有具名参数(含位置与关键字)传递给其他方法
在Ruby方法中传递所有具名参数(含位置与关键字参数)给另一个方法
如果你想在Ruby方法里,不借助*args、**kwargs这类通配符,把当前方法收到的所有位置参数和关键字参数原封不动传递给另一个非super的方法,确实需要一点技巧——因为Ruby没有直接提供获取当前方法所有参数的内置快捷方式。下面是针对不同参数类型的临时解决方案,以及混合场景的思路:
针对关键字参数的实现
如果你的方法只使用关键字参数,可以通过method(__method__)获取当前方法的元信息,再结合binding提取参数值:
def some_method(a_named_parameter:, another_named_parameter:) # 这里可以做一些前置操作 params = method(__method__) .parameters .map { |p| [p[1], binding.local_variable_get(p[1])] } .to_h some_other_method(**params) # 这里可以做一些后置操作 end
原理是:method(__method__).parameters会返回当前方法的参数列表(每个元素是[:key, :参数名]格式),接着我们把参数名和对应的局部变量值映射成哈希,最后用**展开传递给目标方法。
针对位置参数的实现
如果方法只有位置参数,类似的思路,但不需要构建哈希,直接收集参数值数组即可:
def some_method(a_parameter, another_parameter) # 前置操作 params = method(__method__) .parameters .map { |p| binding.local_variable_get(p[1]) } some_other_method(*params) # 后置操作 end
这里parameters返回的元素是[:req, :参数名]格式,我们直接提取每个参数对应的局部变量值,组成数组后用*展开传递。
同时支持位置与关键字参数的思路
如果方法同时包含位置参数和关键字参数,也可以基于method(__method__).parameters的返回值来区分参数类型:
- 位置参数(类型为
:req、:opt等)收集到数组中 - 关键字参数(类型为
:key、:keyreq等)收集到哈希中
然后分别用*和**展开传递给目标方法。不过这种方式需要额外的类型判断逻辑,即使封装成辅助方法,实现起来也会比较繁琐,需要处理多种参数类型的边界情况。
内容的提问来源于stack exchange,提问作者ulferts
相关产品推荐
相关产品推荐

