Ruby 3.0.2与2.x版本Proc.arity返回值差异是兼容问题还是官方变更?
差异性质说明
该差异属于Ruby 3.0版本已正式记录的官方变更,并非意外的向后兼容性问题。
变更细节
- Ruby 2.x版本中,
Symbol#to_proc生成的Proc对象的arity被固定设为1,只能显式标记为仅接收1个参数(即方法调用的接收者对象)。即便实际调用时可以传入更多参数给目标方法,arity属性也不会如实反映这一能力,因此取绝对值后返回结果为1。 - Ruby 3.0对该行为做了修正,将
Symbol#to_proc生成的Proc的arity调整为-2,对应含义是至少需要1个必填参数(接收者),支持传入任意数量的额外参数传递给目标方法,因此取绝对值后得到的结果为2。
逻辑验证
# Ruby全版本均可正常执行,证明Symbol#to_proc一直支持传递额外参数,仅2.x版本的arity返回值和实际能力不匹配 p :+.to_proc.call(1, 2) # 输出 3 p :concat.to_proc.call("hello", " world", "!") # 输出 "hello world!"
该变更仅修正了arity属性返回值不准确的问题,不会影响现有Symbol#to_proc的调用逻辑,不属于破坏性变更。
内容的提问来源于stack exchange,提问作者Sammy171
相关产品推荐
相关产品推荐

