Ruby 3.1.0 发布
由 naruse 发布于 2021年12月25日
我们很高兴地宣布 Ruby 3.1.0 的发布。Ruby 3.1 保留了与 Ruby 3.0 的兼容性,并增加了很多新功能。
YJIT:新的实验性进程内 JIT 编译器
Ruby 3.1 合并了 YJIT,这是一个由 Shopify 开发的新型进程内 JIT 编译器。
自 Ruby 2.6 于 2018 年引入 MJIT 以来,其性能有了很大的提升,最终在去年实现了 Ruby3x3。但尽管 Optcarrot 基准测试显示出惊人的加速效果,JIT 并没有惠及现实世界的商业应用程序。
最近 Shopify 为加速其 Rails 应用程序贡献了许多 Ruby 改进。YJIT 是一项重要贡献,旨在提高 Rails 应用程序的性能。
MJIT 是一个基于方法的 JIT 编译器,使用外部 C 编译器,而 YJIT 使用基本块版本化,并将 JIT 编译器内置其中。通过惰性基本块版本化 (LBBV),它首先编译方法的开头,然后在动态确定参数和变量的类型时,逐步编译剩余部分。有关详细介绍,请参阅 YJIT: a basic block versioning JIT compiler for CRuby。
借助这项技术,YJIT 在大多数实际软件上都能实现快速预热时间和性能提升,在 railsbench 上最高提升 22%,在 liquid-render 上最高提升 39%。
YJIT 仍是一项实验性功能,因此默认禁用。如果您想使用它,请指定命令行选项 --yjit 来启用 YJIT。目前它仅限于类 Unix 的 x86-64 平台。
- https://bugs.ruby-lang.org/issues/18229
- https://shopify.engineering/yjit-just-in-time-compiler-cruby
- https://www.youtube.com/watch?v=PBVLf3yfMs8
debug gem:一个新的调试器
一个完全重写的调试器 debug.gem 已包含在内。debug.gem 具有以下功能:
- 提高调试性能(即使启用调试器也不会减慢应用程序的速度)。
- 支持远程调试。
- 支持丰富的调试前端(目前支持 VS Code 和 Chrome 浏览器)。
- 支持多进程/多线程调试。
- 多彩的 REPL。
- 以及录制与回放、追踪等其他实用功能。
Ruby 曾捆绑 lib/debug.rb,但维护不善,在性能和功能方面存在问题。debug.gem 完全取代了 lib/debug.rb。
error_highlight:回溯中的细粒度错误定位
引入了一个内置 gem error_highlight。它包含回溯中的细粒度错误定位。
$ ruby test.rb
test.rb:1:in `<main>': undefined method `time' for 1:Integer (NoMethodError)
1.time {}
^^^^^
Did you mean? times
目前仅支持 NameError。
此 gem 默认启用。您可以使用命令行选项 --disable-error_highlight 禁用它。有关详细信息,请参阅 error_highlight 仓库。
IRB 自动完成和文档显示
IRB 现在具有自动完成功能,您可以直接输入代码,即可弹出完成候选对话框。您可以使用 Tab 和 Shift+Tab 在其中上下移动。
如果您安装了文档,当您选择一个完成候选时,文档对话框将出现在完成候选对话框旁边,显示部分内容。您可以通过按 Alt+d 阅读完整文档。
其他值得注意的新特性
语言
- Hash 字面量和关键字参数中的值可以省略。 [Feature #14579]
{x:, y:}是{x: x, y: y}的语法糖。foo(x:, y:)是foo(x: x, y: y)的语法糖。
-
模式匹配中的 Pin 操作符(
^)现在接受表达式。 [Feature #17411]Prime.each_cons(2).lazy.find_all{_1 in [n, ^(n + 2)]}.take(3).to_a #=> [[3, 5], [5, 7], [11, 13]] -
在一行模式匹配中可以省略括号。 [Feature #16182]
[0, 1] => _, x {y: 2} => y: x #=> 1 y #=> 2
RBS
RBS 是一种描述 Ruby 程序结构的语言。有关详细信息,请参阅 RBS 仓库。
Ruby 3.0.0 以来的更新
- 泛型类型参数可以被约束。 (PR)
- 支持泛型类型别名。 (PR)
- 引入了
rbs collection用于管理 gem 的 RBS。 (doc) - 已添加/更新了许多内置库和标准库的签名。
- 它还包含许多错误修复和性能改进。
有关更多信息,请参阅 RBS 更新日志。
TypeProf
TypeProf 是 Ruby 的静态类型分析器。它从非类型注解的 Ruby 代码生成 RBS 原型。有关详细信息,请参阅 文档。
自 Ruby 3.0.0 以来,主要更新是名为“TypeProf for IDE”的实验性 IDE 支持。

VS Code 扩展在每个方法定义上方显示一个猜测的(或在 RBS 文件中明确写入的)方法签名,在可能导致名称错误或类型错误的的代码下方绘制红色下划线,并完成方法名称(即显示方法候选)。有关详细信息,请参阅 文档。
此外,本次发布还包括许多错误修复和性能改进。
性能改进
- MJIT
- 对于 Rails 等工作负载,默认的
--jit-max-cache已从 100 更改为 10000。JIT 编译器不再跳过编译超过 1000 条指令的方法。 - 为了支持 Rails 的 Zeitwerk,当启用了类事件的 TracePoint 时,JIT 编译的代码不再被取消。
- 对于 Rails 等工作负载,默认的
3.0 以来的其他值得注意的更改
- 一行模式匹配,例如
ary => [x, y, z],不再是实验性的。 - 多重赋值的求值顺序略有改变。 [Bug #4443]
- 在 Ruby 3.0 中,
foo[0], bar[0] = baz, qux的求值顺序是baz,qux,foo,然后是bar。在 Ruby 3.1 中,它的求值顺序是foo,bar,baz,然后是qux。
- 在 Ruby 3.0 中,
-
可变宽度分配:字符串(实验性)。 [Bug #18239]
- Psych 4.0 默认将
Psych.load改为使用safe_load。您可能需要使用 Psych 3.3.2 来迁移到此行为。 [Bug #17866]
标准库更新
- 更新了以下默认 gem。
- RubyGems 3.3.3
- base64 0.1.1
- benchmark 0.2.0
- bigdecimal 3.1.1
- bundler 2.3.3
- cgi 0.3.1
- csv 3.2.2
- date 3.2.2
- did_you_mean 1.6.1
- digest 3.1.0
- drb 2.1.0
- erb 2.2.3
- error_highlight 0.3.0
- etc 1.3.0
- fcntl 1.0.1
- fiddle 1.1.0
- fileutils 1.6.0
- find 0.1.1
- io-console 0.5.10
- io-wait 0.2.1
- ipaddr 1.2.3
- irb 1.4.1
- json 2.6.1
- logger 1.5.0
- net-http 0.2.0
- net-protocol 0.1.2
- nkf 0.1.1
- open-uri 0.2.0
- openssl 3.0.0
- optparse 0.2.0
- ostruct 0.5.2
- pathname 0.2.0
- pp 0.3.0
- prettyprint 0.1.1
- psych 4.0.3
- racc 1.6.0
- rdoc 6.4.0
- readline 0.0.3
- readline-ext 0.1.4
- reline 0.3.0
- resolv 0.2.1
- rinda 0.1.1
- ruby2_keywords 0.0.5
- securerandom 0.1.1
- set 1.0.2
- stringio 3.0.1
- strscan 3.0.1
- tempfile 0.1.2
- time 0.2.0
- timeout 0.2.0
- tmpdir 0.1.2
- un 0.2.0
- uri 0.11.0
- yaml 0.2.0
- zlib 2.1.1
- 更新了以下捆绑 gem。
- minitest 5.15.0
- power_assert 2.0.1
- rake 13.0.6
- test-unit 3.5.3
- rexml 3.2.5
- rbs 2.0.0
- typeprof 0.21.1
- 以下默认 gem 现在是捆绑 gem。您需要在 bundler 环境下的
Gemfile中添加以下库。- net-ftp 0.1.3
- net-imap 0.2.2
- net-pop 0.1.1
- net-smtp 0.3.1
- matrix 0.4.2
- prime 0.1.2
- debug 1.4.0
与 Ruby 3.0.0 相比,此次更改涉及 3124 个文件,新增 551760 行,删减 99167 行!
圣诞快乐,节日愉快,尽情享受 Ruby 3.1 的编程乐趣吧!
下载
-
https://cache.ruby-lang.org/pub/ruby/3.1/ruby-3.1.0.tar.gz
SIZE: 20103517 SHA1: e4e8c20dd2a1fdef4d3e5bd5a3461000dd17f226 SHA256: 50a0504c6edcb4d61ce6b8cfdbddaa95707195fab0ecd7b5e92654b2a9412854 SHA512: 76009d325e961e601d9a287e36490cbc1f3b5dbf4878fa6eab2c4daa5ff2fed78cbc7525cd87b09828f97cbe2beb30f528928bcc5647af745d03dffe7c5baaa9 -
https://cache.ruby-lang.org/pub/ruby/3.1/ruby-3.1.0.tar.xz
SIZE: 14709096 SHA1: 92b603c2a69fb25d66c337a63e94280984edea11 SHA256: 1a0e0b69b9b062b6299ff1f6c6d77b66aff3995f63d1d8b8771e7a113ec472e2 SHA512: a2bb6b5e62d5fa06dd9c30cf84ddcb2c27cb87fbaaffd2309a44391a6b110e1dde6b7b0d8c659b56387ee3c9b4264003f3532d5a374123a7c187ebba9293f320 -
https://cache.ruby-lang.org/pub/ruby/3.1/ruby-3.1.0.zip
SIZE: 24388179 SHA1: e37435956d6f840a0e8758d7374bc7e0e346105f SHA256: a3bfcd486d09c065d46421da0ff3d430ce4423fefd80cea63c6595d83ae4af0e SHA512: 67db71144e06da2c1c25eaf413d1417c99a4b18738a573f9e3371c11ea242eee9dcbdc3de17336f25ab5060039fe034e57298943d344be9cd9eb33bb56e2e1c6
什么是 Ruby
Ruby 最初由 Matz (Yukihiro Matsumoto) 于 1993 年开发,现在作为开源项目进行开发。它运行在多个平台上,并在世界各地广泛使用,尤其是在 Web 开发领域。
近期新闻
Ruby 4.0.0 发布
我们很高兴地宣布 Ruby 4.0.0 的发布。Ruby 4.0 引入了“Ruby Box”和“ZJIT”,并增加了许多改进。
由 naruse 发布于 2025 年 12 月 25 日
Ruby 文档的全新外观
继 ruby-lang.org 重新设计之后,我们还有更多好消息来庆祝 Ruby 成立 30 周年:docs.ruby-lang.org 采用了 Aliki——RDoc 的新默认主题,焕然一新。
由 Stan Lo 发布于 2025 年 12 月 23 日
重新设计我们的网站标识
我们很高兴地宣布对我们的网站进行全面重新设计。此次更新的设计由 Akatsuka Taeko 创作。
由 Hiroshi SHIBATA 发布于 2025 年 12 月 22 日
Ruby 4.0.0 preview3 发布
我们很高兴地宣布 Ruby 4.0.0-preview3 的发布。Ruby 4.0 引入了 Ruby::Box 和“ZJIT”,并增加了许多改进。
由 naruse 发布于 2025 年 12 月 18 日