Ruby中忽略参数:匿名splat(*)与参数转发(...)的选型对比
Ruby中忽略参数的method_missing:匿名splat(*) vs 参数转发(...)
核心结论
- 惯用风格:Ruby 2.7+版本中,参数转发
...是更符合惯用写法的选择,语义更贴合“完全忽略参数”的需求。 - 性能表现:两者执行时间几乎无差异,但
...在内存分配上略优,无需创建未使用的数组对象。
一、语义与惯用性分析
匿名splat*
本质是将所有传入参数打包成一个匿名数组,即使你不使用这个数组,语义上仍带有“收集参数”的暗示,和“完全忽略参数”的需求不完全匹配。在Ruby 2.7之前,这是忽略参数的常见写法,但现在已被...替代。
参数转发...
Ruby 2.7引入的特性,原本用于参数转发,但语义可延伸为“接收任意参数但不做处理”。它直接表达了“我不关心传入的参数是什么”的意图,是现代Ruby社区推荐的写法。
二、性能与内存细节
从你在Ruby 3.3.5(禁用YJIT)的测试结果来看:
- 执行时间:两者几乎一致,因为YARV虚拟机对两种写法都做了优化。
- 内存分配:
- 匿名splat
*理论上会创建数组,但YARV的优化器会检测到数组未被使用,可能跳过创建(这也是你测试中数组分配数量波动的原因)。 - 参数转发
...内部无需创建数组,直接跳过参数处理,长期来看内存分配更稳定且更少。
- 匿名splat
你的补充测试中数组分配数量波动,是因为Ruby的垃圾回收和基础优化机制动态调整导致的,单次测试结果不具备绝对参考性,但整体趋势上...的内存开销更低。
三、代码示例
推荐写法(参数转发...)
def method_missing(...) nil end
旧写法(匿名splat*)
def method_missing(*) nil end
总结
如果你使用Ruby 2.7及以上版本,优先选择...:
- 语义更精准匹配“忽略参数”的需求;
- 内存分配略优;
- 符合现代Ruby的编码习惯。
内容的提问来源于stack exchange,提问作者flavio
相关产品推荐
相关产品推荐

