Ruby中方法内无显式块参数时使用Proc.new是否已不再支持?
关于Proc.new捕获方法关联块特性的版本支持情况
Ruby 3.1.0起正式移除了「在带块的方法内无参数调用Proc.new来捕获方法关联块」的特性,Ruby 3.0.x是最后支持该特性的版本系列。
这个特性本质是MRI(Ruby参考实现)早期的意外副作用,从未被纳入Ruby语言规范,也不保证跨实现兼容。YARV(Ruby 1.9+默认VM)后期已逐步弱化该行为,到Ruby 3.1版本彻底移除,此时无块调用Proc.new会直接抛出ArgumentError: tried to create Proc object without a block错误。
官方文档在Ruby 3.1.0版本更新中删除了所有关于该特性的描述,3.0.5是最后保留该描述的版本。你测试的这段代码在Ruby 3.1+环境下,invoke2方法会触发报错:
def invoke(&b) b.call end def invoke2 Proc.new.call end invoke {puts 'hello'} invoke2 {puts 'hello'}
Matz著作中常见的过时内容示例
Matz的经典Ruby书籍(如《Ruby编程语言》)基于较早版本编写,部分内容已不符合新版本特性,常见过时点包括:
- 字符串编码模型:旧书基于Ruby 1.8的默认ASCII编码体系,而Ruby 1.9+已切换为UTF-8默认编码,字符串内部存储、操作方法(如
String#each行为)的描述已过时。 - 块与Proc的行为差异:早期对
Proc.new、lambda、proc方法的行为差异描述,在Ruby 2.0+版本中已有调整(比如lambda的参数校验规则变化)。 - 哈希语法:旧书以
=>哈希键值对写法为主,Ruby 1.9+新增的符号键简化语法(如{ key: value })未被覆盖。 - 并发特性:旧书对Ruby线程模型的描述,与Ruby 2.0+引入的Fiber、Ruby 3.0+引入的Ractor并行模型完全不符。
Ruby版本特性变更的官方参考文档
- Ruby NEWS文件:每个Ruby版本发布时都会附带详细的NEWS文档,记录版本内的特性新增、废弃、移除、Bug修复等所有变更。
- 官方废弃特性文档:Ruby官方手册专门维护了废弃特性列表,说明每个废弃特性的替代方案和移除时间线。
- 版本发布公告:Ruby核心团队在每个大版本(如3.0、3.1)发布时,会通过官方博客发布公告,重点解读重大特性变更和不兼容调整。
内容的提问来源于stack exchange,提问作者BobRodes
相关产品推荐
相关产品推荐

