Ruby 新闻更新 https://www.ruby-lang.org/zh_cn/feeds/news.rss zh-CN 40 来自 ruby-lang.org 的最新文章。 Ruby 3.2.11 已发布 <p>Ruby 3.2.11 已发布。 此版本包括了 <a href="https://www.ruby-lang.org/zh_cn/news/2026/03/05/buffer-overflow-zlib-cve-2026-27820/">处理 CVE-2026-27820 的 zlib gem 更新</a>。</p> <p>详情可参考 <a href="https://github.com/ruby/ruby/releases/tag/v3_2_11">GitHub 发布说明</a>。</p> <p>此版本是 Ruby 3.2 系列的最后版本。我们将不会再发布 Ruby 3.2 系列的后续更新,包括安全补丁。</p> <p>我们建议您更新到 Ruby 3.4 或 4.0。</p> <h2 id="下载">下载</h2> <ul> <li> <p><a href="https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.11.tar.gz">https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.11.tar.gz</a></p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>文件大小: 19984344 SHA1: 9534a3aa08d2ccb4d3c50b1301b2da9a9b91c4ab SHA256: b3eeabd6636f334531db3ffdc3229eb05e524740e6c84fdc043720573cf2f8b2 SHA512: 95896bbf519604da0dc3d82066ac92c3f661b2ee9ffd8e2c9effce4773677445f1dcc43b05539050024b57f4f94f43984a734a03015ac6e29679e79d5a093a67 </code></pre></div> </div> </li> <li> <p><a href="https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.11.tar.xz">https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.11.tar.xz</a></p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>文件大小: 14695828 SHA1: 501cecc15ba079087967888ae455d62e5886fbc1 SHA256: c13aec0c206725d5d356acbae6e5fd8bffd92dc325aec14fd5dd7795d4b763d2 SHA512: 418739d476d34e2467e7f1ee60ff63a1969a362b49871bdc488676c1ac7d28b198deee85e2bd951a23f5b0e8425bc89ca59d5c8cb8415fa5ed835555e3d3af8d </code></pre></div> </div> </li> <li> <p><a href="https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.11.zip">https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.11.zip</a></p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>文件大小: 24594356 SHA1: 7e84c9433f32a758da123d3b5532cc632d19d503 SHA256: 08ab90aa4ada9268e96aa47fb6c3a77fdb3b2f792f2671053e3b55a6141618ce SHA512: 133d63cd9bb7c9fe38eecd18c996013de0a56fef09c89c42f4fc9c383f09ab4ab3b0b31edbadd1fd1aaa797fbb9c86128ded51c6e5263cd3225754e714b3d195 </code></pre></div> </div> </li> </ul> <h2 id="发布说明">发布说明</h2> <p>自从 <a href="https://www.ruby-lang.org/zh_cn/news/2022/12/25/ruby-3-2-0-released/">2022 年 12 月 25 日发布 Ruby 3.2.0</a> 以来,对 Ruby 3.2 系列的支持已超过 3 年。</p> <p>感谢在 Ruby 3.2 系列的整个生命周期中,为之付出贡献的所有提交者、开发者和用户。</p> <p>由 <strong>hsbt</strong> 发表于 2026-03-27<br />翻译: GAO Jun</p> Fri, 27 Mar 2026 00:00:00 +0000 https://www.ruby-lang.org/zh_cn/news/2026/03/27/ruby-3-2-11-released/ https://www.ruby-lang.org/zh_cn/news/2026/03/27/ruby-3-2-11-released/ Ruby 3.3.11 已发布 <p>Ruby 3.3.11 已发布。此版本包括了 <a href="https://www.ruby-lang.org/zh_cn/news/2026/03/05/buffer-overflow-zlib-cve-2026-27820/">处理 CVE-2026-27820 的 zlib gem 更新</a>,以及一些其他问题补丁。</p> <p>详情可参考 <a href="https://github.com/ruby/ruby/releases/tag/v3_3_11">GitHub 发布说明</a>。</p> <p>此版本是 Ruby 3.3 系列的最后一个正常维护版本。此后,Ruby 3.3 将进入安全维护阶段。安全维护阶段中,将不再提供普通的问题补丁,只会提供安全补丁以及修复严重的构建问题。</p> <p>安全维护阶段将持续一年,即持续至 2027 年 3 月。此后,Ruby 3.3 的官方支持将终止。我们建议您迁移到 Ruby 3.4 或 4.0。</p> <h2 id="下载">下载</h2> <ul> <li> <p><a href="https://cache.ruby-lang.org/pub/ruby/3.3/ruby-3.3.11.tar.gz">https://cache.ruby-lang.org/pub/ruby/3.3/ruby-3.3.11.tar.gz</a></p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>文件大小: 21483089 SHA1: 7f18e7e74ab64c5b159a8dfe8da3cc019b32bdb6 SHA256: 59f0fafb1a59a05dc3765117af3fa68e153eb48254708549f321c1e9e078d7a0 SHA512: effbcffce1cad4fa7158ce9159b6109a92e88c29f5d33151c2ec609c54fe24b747354b0e722e0fefe8164700acb2d650b8c65aad0e17e3dec2c26969a44fc524 </code></pre></div> </div> </li> <li> <p><a href="https://cache.ruby-lang.org/pub/ruby/3.3/ruby-3.3.11.tar.xz">https://cache.ruby-lang.org/pub/ruby/3.3/ruby-3.3.11.tar.xz</a></p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>文件大小: 15879844 SHA1: 520afae357283c96610f340c92a6567ff7b2b923 SHA256: 9116bb2e313203bd78cd3e8dc09284d34b2645f725877623a7185bf3807c8ca3 SHA512: 1f8eb206a90121015b294dada7ea61ebd136e7e7dbb1c4bb7df21b85f359a2e733f438153bf07c57815a963e4ef3f766081fd4226caa6547f4c263b33ed7726e </code></pre></div> </div> </li> <li> <p><a href="https://cache.ruby-lang.org/pub/ruby/3.3/ruby-3.3.11.zip">https://cache.ruby-lang.org/pub/ruby/3.3/ruby-3.3.11.zip</a></p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>文件大小: 26947458 SHA1: e01bf3ff08d96438decc35b80d4d289b9d012681 SHA256: 94c9d920aade547bafe392c6a288f996c151cb217ab548be5747867353568243 SHA512: fc4d4299df8414daeb81ae329d67f4d0ea961443e3505407a4faa134d8b9971c49b5c6750d55b4fdc210e15276845ee9b11c4ee25461f99a743f714da7096391 </code></pre></div> </div> </li> </ul> <h2 id="发布说明">发布说明</h2> <p>许多提交者、开发人员以及用户提供了问题报告,帮助我们完成了此版本。 感谢他们的贡献。</p> <p>由 <strong>hsbt</strong> 发表于 2026-03-26<br />翻译: GAO Jun</p> Thu, 26 Mar 2026 00:00:00 +0000 https://www.ruby-lang.org/zh_cn/news/2026/03/26/ruby-3-3-11-released/ https://www.ruby-lang.org/zh_cn/news/2026/03/26/ruby-3-3-11-released/ Ruby 4.0.2 已发布 <p>Ruby 4.0.2 已发布。</p> <p>此版本是例行更新,修复了 YJIT 环境中 <a href="https://github.com/puma/puma/issues/3620">Puma 的 NoMethodError</a>。 详情可参考 <a href="https://github.com/ruby/ruby/releases/tag/v4.0.2">GitHub 发布说明</a>。</p> <h2 id="发布计划">发布计划</h2> <p>我们计划每 2 个月为最新的 Ruby 稳定版本(目前是 Ruby 4.0)发布更新。 Ruby 4.0.3 将于五月发布,4.0.4 将于七月发布,4.0.5 将于九月发布,4.0.6 将于十一月发布。</p> <p>如果存在会影响到大量用户的重大变更,我们也可能会提前发布新版本,后续版本的发布计划也将进行相应调整。</p> <h2 id="下载">下载</h2> <ul> <li> <p><a href="https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.2.tar.gz">https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.2.tar.gz</a></p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>文件大小: 23824654 SHA1: 47c3627e2bdfe53dda77d3fa1730e44ef1ed7dfe SHA256: 51502b26b50b68df4963336ca41e368cde92c928faf91654de4c4c1791f82aac SHA512: 16a6ca0e9407051f58c8e3c4ec2058c52d62a9863174a3eb6dd5e9e2e893a66427e97a6e7fc8b4c3480163bd19a7a0ec4c00e481f90ff42e8f30bdbc9555f628 </code></pre></div> </div> </li> <li> <p><a href="https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.2.tar.xz">https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.2.tar.xz</a></p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>文件大小: 17874724 SHA1: d927e26d22b15c6737df24cdf6ae80542a057240 SHA256: 4618db85bb9ec04d8152d0099db488694a3d3c4f52106625e4ad547f1318db87 SHA512: be71a5452068dfc3c86b8ec07456b3fdf6dc64e8c0cd16c358fc4ed8ac08707a9c28285ea8a79dbef82031d8c93c71032a82a0b45f3c9ac5325bf3b70d06fbf2 </code></pre></div> </div> </li> <li> <p><a href="https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.2.zip">https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.2.zip</a></p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>文件大小: 29123568 SHA1: 3cfd813761009f8fbb6001cf14149dc03bcd85d7 SHA256: 7cdbef9028a64f73ca59e21cd46c73c794df9c8294f1cb5c50c4d93c6060b240 SHA512: ecac80a6861fd666fc024701233f5b5b93bed9ed9047cd7ca9e11799681b0102729cc53203cee4ac33245a41b786a4a4c802633d1031881200378b011ed74580 </code></pre></div> </div> </li> </ul> <h2 id="发布说明">发布说明</h2> <p>许多提交者、开发人员以及用户提供了问题报告,帮助我们完成了此版本。 感谢他们的贡献。</p> <p>由 <strong>k0kubun</strong> 发表于 2026-03-16<br />翻译: GAO Jun</p> Mon, 16 Mar 2026 23:18:29 +0000 https://www.ruby-lang.org/zh_cn/news/2026/03/16/ruby-4-0-2-released/ https://www.ruby-lang.org/zh_cn/news/2026/03/16/ruby-4-0-2-released/ Ruby 3.4.9 已发布 <p>Ruby 3.4.9 已发布。</p> <p>此版本包括了 <a href="https://www.ruby-lang.org/en/news/2026/03/05/buffer-overflow-zlib-cve-2026-27820/">处理 CVE-2026-27820 的 zlib gem 更新</a>,以及一些其他问题补丁。 详情可参考 <a href="https://github.com/ruby/ruby/releases/tag/v3_4_9">GitHub 发布说明</a>。</p> <p>我们建议您更新 <code class="language-plaintext highlighter-rouge">zlib</code> gem。由于包含了 <code class="language-plaintext highlighter-rouge">zlib</code> 的更新版本,对于希望继续将其作为默认 gem 的用户,此版本能让您不用再单独处理 <code class="language-plaintext highlighter-rouge">zlib</code> 更新。</p> <h2 id="下载">下载</h2> <ul> <li> <p><a href="https://cache.ruby-lang.org/pub/ruby/3.4/ruby-3.4.9.tar.gz">https://cache.ruby-lang.org/pub/ruby/3.4/ruby-3.4.9.tar.gz</a></p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>文件大小: 22456968 SHA1: 6386200753caf4e336dafceeee165fa73fd234ec SHA256: 7bb4d4f5e807cc27251d14d9d6086d182c5b25875191e44ab15b709cd7a7dd9c SHA512: ac7147c0e575cf74f669abb991ee8695d4191c919f306f124b3ee85d6b61361e752a4f1afb7bdffb49aee21edace1fcc9bf2b074ada15fa6c1eb611354c1d54b </code></pre></div> </div> </li> <li> <p><a href="https://cache.ruby-lang.org/pub/ruby/3.4/ruby-3.4.9.tar.xz">https://cache.ruby-lang.org/pub/ruby/3.4/ruby-3.4.9.tar.xz</a></p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>文件大小: 16682004 SHA1: 1eb1b0b45b9e9191de9d2f360164e60eedf77012. SHA256: 4231c54072601a171faed1699f105985e9971c94cd382b78feb4eb44eec2dd1a SHA512: 356fb47cc56f2d25198cb95253fc20ff7d9a6fd1fa53bc475e5c440012aebe27562537c399d271357235114ade263fd625029b66cb0f9b526f9c04f169fb9580 </code></pre></div> </div> </li> <li> <p><a href="https://cache.ruby-lang.org/pub/ruby/3.4/ruby-3.4.9.zip">https://cache.ruby-lang.org/pub/ruby/3.4/ruby-3.4.9.zip</a></p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>文件大小: 27645906 SHA1: 8c4312fe946c7eaa269e5c7cee90f3b7350235b5 SHA256: a4dd555fddefcdd4a58d2169a568f5887b125edbbda2815ea826ca1833dc41ec SHA512: 1c6cc4d03edb071f79f9ae41d43defa8393b467d30000e89ee872c6fe99bde015421cb1dd3ecfd5f0359c1c095b60833a95cd5f6c4397358f8ed98eace8720e2 </code></pre></div> </div> </li> </ul> <h2 id="发布说明">发布说明</h2> <p>许多提交者、开发人员以及用户提供了问题报告,帮助我们完成了此版本。 感谢他们的贡献。</p> <p>由 <strong>nagachika</strong> 发表于 2026-03-11<br />翻译: GAO Jun</p> Wed, 11 Mar 2026 11:00:00 +0000 https://www.ruby-lang.org/zh_cn/news/2026/03/11/ruby-3-4-9-released/ https://www.ruby-lang.org/zh_cn/news/2026/03/11/ruby-3-4-9-released/ CVE-2026-27820: Zlib::GzipReader 中的缓存区溢出漏洞 <p><code class="language-plaintext highlighter-rouge">Zlib::GzipReader</code> 中存在一个缓存区溢出漏洞。此漏洞的 CVE 编号为 <a href="https://www.cve.org/CVERecord?id=CVE-2026-27820">CVE-2026-27820</a>。 我们建议您更新 <code class="language-plaintext highlighter-rouge">zlib</code> gem。</p> <h3 id="详情">详情</h3> <p><code class="language-plaintext highlighter-rouge">zstream_buffer_ungets</code> 函数会在生成的输出前加上调用者提供的字节,但没有确保对应的 Ruby 字符串的长度是否足够。 当缓冲区长度超过字符串容量时,将导致内存损坏。</p> <h3 id="建议操作">建议操作</h3> <p>我们建议将 <code class="language-plaintext highlighter-rouge">zlib</code> gem 更新到 3.2.3 或后续版本。为了确保与较旧 Ruby 系列绑定版本的兼容性,您可以使用下面的方法进行更新:</p> <ul> <li>Ruby 3.2:更新到 <code class="language-plaintext highlighter-rouge">zlib</code> 3.0.1</li> <li>Ruby 3.3:更新到 <code class="language-plaintext highlighter-rouge">zlib</code> 3.1.2</li> </ul> <p>您可以通过 <code class="language-plaintext highlighter-rouge">gem update zlib</code> 进行更新。如果您使用 bundler,请将 <code class="language-plaintext highlighter-rouge">gem "zlib", "&gt;= 3.2.3"</code> 添加到 Gemfile 中。</p> <h3 id="受影响版本">受影响版本</h3> <p><code class="language-plaintext highlighter-rouge">zlib</code> gem 3.2.2 或之前发布的版本</p> <h3 id="致谢">致谢</h3> <p>感谢 <a href="https://hackerone.com/calysteon">calysteon</a> 汇报此问题。同时感谢 <a href="https://github.com/nobu">nobu</a> 制作了补丁。</p> <h2 id="历史">历史</h2> <ul> <li>最初发布于 2026-03-05 09:00:00 (UTC)</li> </ul> <p>由 <strong>hsbt</strong> 发表于 2026-03-05<br />翻译: GAO Jun</p> Thu, 05 Mar 2026 00:00:00 +0000 https://www.ruby-lang.org/zh_cn/news/2026/03/05/buffer-overflow-zlib-cve-2026-27820/ https://www.ruby-lang.org/zh_cn/news/2026/03/05/buffer-overflow-zlib-cve-2026-27820/ Ruby 3.2.10 已发布 <p>Ruby 3.2.10 已发布。</p> <p>详细信息可参考 <a href="https://github.com/ruby/ruby/releases/tag/v3_2_10">GitHub 发布说明</a>。</p> <h2 id="下载">下载</h2> <ul> <li> <p><a href="https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.10.tar.gz">https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.10.tar.gz</a></p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>文件大小: 19983731 SHA1: 6d7afca27627fbbcc7b933ac4e1a8a58c7a9be0e SHA256: 880acb05e08da8c559c56a13e512bae1b472da67c72ebb750c765f9c2134e689 SHA512: 0f23dbc9b49b1c7c6256ba961c652a4f3659e6127a4c333624fca4e4f6a873cc06b01992b10aa7970a52e99b654fc655a25348a47de73cc786f3e33e8b702295 </code></pre></div> </div> </li> <li> <p><a href="https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.10.tar.xz">https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.10.tar.xz</a></p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>文件大小: 14696548 SHA1: 2cc431a4c64c222b2f13574ec034226cd4fa2580 SHA256: a64a8a910ac2f28834b2170dedea688f06cbc6431fcd65eb18cc49ddbf3826ae SHA512: a89044db8a55bd990d3756e212f2966b62b903eefc96c7e0af89aa4580ff7253d2f64c6c25fc04f2031b959e614bae84b86db36cfdec3a3e8afb5c3026426687 </code></pre></div> </div> </li> <li> <p><a href="https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.10.zip">https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.10.zip</a></p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>文件大小: 24593429 SHA1: e1123828b4b7a39c19342697d5e0af095237f0e3 SHA256: 8e98d793347a48cc7ef45cfdcb1bafa5151d114e8b8fc4dc094a9584af00049e SHA512: b01077c71b9d006378620df95e3ffdb271fddc6f966a8cbbdb53f9f07e67b1924a1eadf200f5cc44ed87640c509b106c995386268d7dc10443a73ea39755aa44 </code></pre></div> </div> </li> </ul> <h2 id="发布说明">发布说明</h2> <p>许多提交者、开发人员以及用户提供了问题报告,帮助我们完成了此版本。 感谢他们的贡献。</p> <p>由 <strong>hsbt</strong> 发表于 2026-01-14<br />翻译: GAO Jun</p> Wed, 14 Jan 2026 01:22:04 +0000 https://www.ruby-lang.org/zh_cn/news/2026/01/14/ruby-3-2-10-released/ https://www.ruby-lang.org/zh_cn/news/2026/01/14/ruby-3-2-10-released/ Ruby 4.0.1 已发布 <p>Ruby 4.0.1 已发布。</p> <p>此版本修复了当子进程在另一个线程中退出时,<code class="language-plaintext highlighter-rouge">Kernel#sleep</code> 函数会异常唤醒的问题,以及其他一些修正。 详情可参考 <a href="https://github.com/ruby/ruby/releases/tag/v4.0.1">GitHub 发布说明</a>。</p> <h2 id="发布计划">发布计划</h2> <p>我们计划每 2 个月发布最新的 Ruby 稳定版本(目前是 Ruby 4.0)。</p> <p>Ruby 4.0.2 将于三月发布,4.0.3 将于五月发布,4.0.4 将于七月发布,4.0.5 将于九月发布,4.0.6 将于十一月发布。</p> <p>如果存在会影响到大量用户的重大变更,我们也可能会提前发布新版本,后续版本的发布计划也将进行相应调整。</p> <h2 id="下载">下载</h2> <ul> <li> <p><a href="https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.1.tar.gz">https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.1.tar.gz</a></p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>文件大小: 23807304 SHA1: 01db5746bbb29b028bd44d505a147d06866b1ab2 SHA256: 3924be2d05db30f4e35f859bf028be85f4b7dd01714142fd823e4af5de2faf9d SHA512: f4eead09c7355b878a34343dd8cfb9c4c36f02ad3b9a7fd42981d722444beca0182ddea4fc771e2e01a05d9f14978a979ba0ba3590d366f53b6947f43fd78aff </code></pre></div> </div> </li> <li> <p><a href="https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.1.tar.xz">https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.1.tar.xz</a></p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>文件大小: 17892492 SHA1: 266e6fa80ed2b4f4bb7de2e98973dc084a1f380e SHA256: 0531fe57dfdb56bf591620d2450642ea0e0964f3512a6ebee7dc9305de69395f SHA512: b67d9d1f97ba30200d103f8454e39dc2d0450819d51d91eb5451d44b0bafc56d2fa48bb1be6c5081babe5828f679984bad02b9bcee7441f6bd34c0a95b8f200b </code></pre></div> </div> </li> <li> <p><a href="https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.1.zip">https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.1.zip</a></p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>文件大小: 29107093 SHA1: d3a9217c848b22636025c525971578557ba5f7a3 SHA256: 36cbcea4972e201464ae1c6686a3a785b115aee9b836d9bbbe6d961dcef2358d SHA512: a8512d3f57254bfacfd4c68ee50bb7cad3168f4d9c3be51658378e5db589032745759c360d8711a060b2ed5b9b78855e498b54fcba869a4e60f03ed4aae68ea8 </code></pre></div> </div> </li> </ul> <h2 id="发布说明">发布说明</h2> <p>许多提交者、开发人员以及用户提供了问题报告,帮助我们完成了此版本。 感谢他们的贡献。</p> <p>由 <strong>k0kubun</strong> 发表于 2026-01-13<br />翻译: GAO Jun</p> Tue, 13 Jan 2026 02:28:48 +0000 https://www.ruby-lang.org/zh_cn/news/2026/01/13/ruby-4-0-1-released/ https://www.ruby-lang.org/zh_cn/news/2026/01/13/ruby-4-0-1-released/ Ruby 4.0.0 已发布 <p>我们很高兴地宣布 Ruby 4.0.0 已发布。 Ruby 4.0 引入了 Ruby::Box 和 “ZJIT”,以及若干改进。</p> <h2 id="ruby-box">Ruby Box</h2> <p>Ruby Box 是一项新的(实验性)特性,提供了定义隔离的功能。 可以通过设置环境变量 <code class="language-plaintext highlighter-rouge">RUBY_BOX=1</code> 来启用 Ruby Box。对应的类是 <code class="language-plaintext highlighter-rouge">Ruby::Box</code>。</p> <p>在 Ruby Box 中载入的定义是隔离的。Ruby Box 之间可以互相隔离:猴子补丁、全局变量、类变量、类/模块定义、加载的原生库和 Ruby 库。</p> <p>预期使用场景包括:</p> <ul> <li>在 box 中运行带有猴子补丁的测试用例,避免影响其他测试用例</li> <li>在应用服务器的 Ruby 进程中,并行运行 Web 应用 box,以此进行蓝绿部署</li> <li>在 Web 应用的 box 中并行运行,在一段时间内,通过响应时间差异来评估依赖更新的效果</li> <li>用作基础(底层)API,以实现某种“包”(高层)API(尚未设计)。</li> </ul> <p>“Ruby Box” 的详细信息,可以参阅 <a href="https://docs.ruby-lang.org/en/master/Ruby/Box.html">Ruby::Box</a>。 [<a href="https://bugs.ruby-lang.org/issues/21311">Feature #21311</a>] [<a href="https://bugs.ruby-lang.org/issues/21385">Misc #21385</a>]</p> <h2 id="zjit">ZJIT</h2> <p>ZJIT 是一个新的即时 (JIT) 编译器,它是作为 YJIT 的下一代产品进行开发的。您需要使用 Rust 1.85.0 或后续版本来构建 Ruby 才能使用, 然后在运行时,指定 <code class="language-plaintext highlighter-rouge">--zjit</code> 来启用。</p> <p>我们之所以创建这个新的 Ruby 编译器,是为了既能够提升性能上限(通过更大的变异单元和 SSA IR), 又能够鼓励更多的外部贡献(通过成为更传统的方法编译器)。更多详情,可以参阅 <a href="https://railsatscale.com/2025-12-24-launch-zjit/">我们的博客</a>。</p> <p>ZJIT 目前比解释器更快,但还不如 YJIT。我们鼓励您尝试 ZJIT,但目前不建议将其用于生产环境。敬请期待 Ruby 4.1 的 ZJIT。</p> <h2 id="ractor-实现">Ractor 实现</h2> <p>Ractor,即 Ruby 的并行执行机制,获得了多项改进。新类 <code class="language-plaintext highlighter-rouge">Ractor::Port</code> 被用来解决消息收发的相关问题(参见 <a href="https://dev.to/ko1/ractorport-revamping-the-ractor-api-98">我们的博客</a>)。 另外,<code class="language-plaintext highlighter-rouge">Ractor.shareable_proc</code> 让 Ractor 之间共享 <code class="language-plaintext highlighter-rouge">Proc</code> 对象更加容易。</p> <p>性能方面,改进了许多内部数据结构,大大减少了全局锁的争用,从而提升了并行性能。此外,Ractor 现在共享更少的内部数据,这也降低了并行运算时的 CPU 缓存争用。</p> <p>Ractor 最初在 Ruby 3.0 作为实验性功能被引入。我们计划明年取消其 “实验性” 状态。</p> <h2 id="语言变化">语言变化</h2> <ul> <li> <p><code class="language-plaintext highlighter-rouge">*nil</code> 不再调用 <code class="language-plaintext highlighter-rouge">nil.to_a</code>,就像 <code class="language-plaintext highlighter-rouge">**nil</code> 不再调用 <code class="language-plaintext highlighter-rouge">nil.to_hash</code>。 [<a href="https://bugs.ruby-lang.org/issues/21047">Feature #21047</a>]</p> </li> <li> <p>行首的逻辑二元运算符 (<code class="language-plaintext highlighter-rouge">||</code>,<code class="language-plaintext highlighter-rouge">&amp;&amp;</code>,<code class="language-plaintext highlighter-rouge">and</code> 和 <code class="language-plaintext highlighter-rouge">or</code>) 与行首的 <code class="language-plaintext highlighter-rouge">.</code> 一样,延续上一行。下面两段代码是等价的:</p> <div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="k">if</span> <span class="n">condition1</span> <span class="o">&amp;&amp;</span> <span class="n">condition2</span> <span class="o">...</span> <span class="k">end</span> </code></pre></div> </div> <div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="k">if</span> <span class="n">condition1</span> <span class="o">&amp;&amp;</span> <span class="n">condition2</span> <span class="o">...</span> <span class="k">end</span> </code></pre></div> </div> <p>[<a href="https://bugs.ruby-lang.org/issues/20925">Feature #20925</a>]</p> </li> </ul> <h2 id="核心类更新">核心类更新</h2> <p>注意:我们只列出了重要的核心类更新。</p> <ul> <li> <p>Array</p> <ul> <li>新增 <code class="language-plaintext highlighter-rouge">Array#rfind</code>,提供了等价于 <code class="language-plaintext highlighter-rouge">array.reverse_each.find</code> 的高效方法 [<a href="https://bugs.ruby-lang.org/issues/21678">Feature #21678</a>]</li> <li>新增 <code class="language-plaintext highlighter-rouge">Array#find</code>,提供了比 <code class="language-plaintext highlighter-rouge">Enumerable#find</code> 更高效的覆盖方法 [<a href="https://bugs.ruby-lang.org/issues/21678">Feature #21678</a>]</li> </ul> </li> <li> <p>Binding</p> <ul> <li> <p><code class="language-plaintext highlighter-rouge">Binding#local_variables</code> 不再包含数字引用参数(如 <code class="language-plaintext highlighter-rouge">_1</code>, <code class="language-plaintext highlighter-rouge">_2</code>)。 同样, <code class="language-plaintext highlighter-rouge">Binding#local_variable_get</code> 和 <code class="language-plaintext highlighter-rouge">Binding#local_variable_set</code> 也会拒绝处理数字引用参数。 [<a href="https://bugs.ruby-lang.org/issues/21049">Bug #21049</a>]</p> </li> <li> <p>新增 <code class="language-plaintext highlighter-rouge">Binding#implicit_parameters</code>,<code class="language-plaintext highlighter-rouge">Binding#implicit_parameter_get</code> 和 <code class="language-plaintext highlighter-rouge">Binding#implicit_parameter_defined?</code>。用于访问数字引用参数和 <code class="language-plaintext highlighter-rouge">it</code> 参数。[<a href="https://bugs.ruby-lang.org/issues/21049">Bug #21049</a>]</p> </li> </ul> </li> <li> <p>Enumerator</p> <ul> <li> <p><code class="language-plaintext highlighter-rouge">Enumerator.produce</code> 现在能够接受一个可选关键词参数 <code class="language-plaintext highlighter-rouge">size</code> 来指定枚举器的大小。 这个参数可以是:整数,<code class="language-plaintext highlighter-rouge">Float::INFINITY</code>,可调用对象(如 lambda) 或 <code class="language-plaintext highlighter-rouge">nil</code>(表示未知大小)。 当此参数未指定时,默认使用 <code class="language-plaintext highlighter-rouge">Float::INFINITY</code>。</p> <div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="c1"># 无限枚举器</span> <span class="n">enum</span> <span class="o">=</span> <span class="no">Enumerator</span><span class="p">.</span><span class="nf">produce</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="ss">size: </span><span class="no">Float</span><span class="o">::</span><span class="no">INFINITY</span><span class="p">,</span> <span class="o">&amp;</span><span class="ss">:succ</span><span class="p">)</span> <span class="n">enum</span><span class="p">.</span><span class="nf">size</span> <span class="c1"># =&gt; Float::INFINITY</span> <span class="c1"># 有限枚举器,指定了一个可计算的大小</span> <span class="n">abs_dir</span> <span class="o">=</span> <span class="no">File</span><span class="p">.</span><span class="nf">expand_path</span><span class="p">(</span><span class="s2">"./baz"</span><span class="p">)</span> <span class="c1"># =&gt; "/foo/bar/baz"</span> <span class="n">traverser</span> <span class="o">=</span> <span class="no">Enumerator</span><span class="p">.</span><span class="nf">produce</span><span class="p">(</span><span class="n">abs_dir</span><span class="p">,</span> <span class="ss">size: </span><span class="o">-&gt;</span> <span class="p">{</span> <span class="n">abs_dir</span><span class="p">.</span><span class="nf">count</span><span class="p">(</span><span class="s2">"/"</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span> <span class="p">})</span> <span class="p">{</span> <span class="k">raise</span> <span class="no">StopIteration</span> <span class="k">if</span> <span class="n">it</span> <span class="o">==</span> <span class="s2">"/"</span> <span class="no">File</span><span class="p">.</span><span class="nf">dirname</span><span class="p">(</span><span class="n">it</span><span class="p">)</span> <span class="p">}</span> <span class="n">traverser</span><span class="p">.</span><span class="nf">size</span> <span class="c1"># =&gt; 4</span> </code></pre></div> </div> <p>[<a href="https://bugs.ruby-lang.org/issues/21701">Feature #21701</a>]</p> </li> </ul> </li> <li> <p>错误高亮显示</p> <ul> <li> <p>当抛出了 ArgumentError,现在在展示代码段时,会同时显示调用方法代码段和方法定义代码段。 [<a href="https://bugs.ruby-lang.org/issues/21543">Feature #21543</a>]</p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>test.rb:1:in 'Object#add': wrong number of arguments (given 1, expected 2) (ArgumentError) caller: test.rb:3 | add(1) ^^^ callee: test.rb:1 | def add(x, y) = x + y ^^^ from test.rb:3:in '&lt;main&gt;' </code></pre></div> </div> </li> </ul> </li> <li> <p>Fiber</p> <ul> <li>引入和 <code class="language-plaintext highlighter-rouge">Kernel#raise</code> 类似的参数支持 <code class="language-plaintext highlighter-rouge">Fiber#raise(cause:)</code>。 [<a href="https://bugs.ruby-lang.org/issues/21360">Feature #21360</a>]</li> </ul> </li> <li> <p>Fiber::Scheduler</p> <ul> <li> <p>引入 <code class="language-plaintext highlighter-rouge">Fiber::Scheduler#fiber_interrupt</code>,允许通过指定异常来终端纤程。 典型的用例是当 IO 操作关闭时,中断等待此 IO 的纤程。 [<a href="https://bugs.ruby-lang.org/issues/21166">Feature #21166</a>]</p> </li> <li> <p>引入 <code class="language-plaintext highlighter-rouge">Fiber::Scheduler#yield</code>,允许纤程调度器在禁用信号异常时继续处理。 [<a href="https://bugs.ruby-lang.org/issues/21633">Bug #21633</a>]</p> </li> <li> <p>再次引入 <code class="language-plaintext highlighter-rouge">Fiber::Scheduler#io_close</code> 钩子来处理异步 <code class="language-plaintext highlighter-rouge">IO#close</code>.</p> </li> <li> <p><code class="language-plaintext highlighter-rouge">Fiber::Scheduler#io_write</code> 在刷新 IO 写缓存时调用。 [<a href="https://bugs.ruby-lang.org/issues/21789">Bug #21789</a>]</p> </li> </ul> </li> <li> <p>File</p> <ul> <li>Linux 中,<code class="language-plaintext highlighter-rouge">File::Stat#birthtime</code> 在操作系统和文件系统支持的情况下,会通过 <code class="language-plaintext highlighter-rouge">statx</code> 系统调用实现。 [<a href="https://bugs.ruby-lang.org/issues/21205">Feature #21205</a>]</li> </ul> </li> <li> <p>IO</p> <ul> <li> <p><code class="language-plaintext highlighter-rouge">IO.select</code> 允许使用 <code class="language-plaintext highlighter-rouge">Float::INFINITY</code> 作为超时参数。 [<a href="https://bugs.ruby-lang.org/issues/20610">Feature #20610</a>]</p> </li> <li> <p>声明废弃行为:<code class="language-plaintext highlighter-rouge">IO</code> 类以传入 <code class="language-plaintext highlighter-rouge">|</code> 起始的字符串来创建进程的功能被移除。 [<a href="https://bugs.ruby-lang.org/issues/19630">Feature #19630</a>]</p> </li> </ul> </li> <li> <p>Kernel</p> <ul> <li> <p><code class="language-plaintext highlighter-rouge">Kernel#inspect</code> 现在会检查是否存在 <code class="language-plaintext highlighter-rouge">#instance_variables_to_inspect</code> 方法, 这个方法可以用来控制在 <code class="language-plaintext highlighter-rouge">#inspect</code> 的结果字符串中包含哪些实例变量:</p> <div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="k">class</span> <span class="nc">DatabaseConfig</span> <span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="n">user</span><span class="p">,</span> <span class="n">password</span><span class="p">)</span> <span class="vi">@host</span> <span class="o">=</span> <span class="n">host</span> <span class="vi">@user</span> <span class="o">=</span> <span class="n">user</span> <span class="vi">@password</span> <span class="o">=</span> <span class="n">password</span> <span class="k">end</span> <span class="kp">private</span> <span class="k">def</span> <span class="nf">instance_variables_to_inspect</span> <span class="o">=</span> <span class="p">[</span><span class="ss">:@host</span><span class="p">,</span> <span class="ss">:@user</span><span class="p">]</span> <span class="k">end</span> <span class="n">conf</span> <span class="o">=</span> <span class="no">DatabaseConfig</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="s2">"localhost"</span><span class="p">,</span> <span class="s2">"root"</span><span class="p">,</span> <span class="s2">"hunter2"</span><span class="p">)</span> <span class="n">conf</span><span class="p">.</span><span class="nf">inspect</span> <span class="c1">#=&gt; #&lt;DatabaseConfig:0x0000000104def350 @host="localhost", @user="root"&gt;</span> </code></pre></div> </div> <p>[<a href="https://bugs.ruby-lang.org/issues/21219">Feature #21219</a>]</p> </li> <li> <p>声明废弃行为:<code class="language-plaintext highlighter-rouge">Kernel#open</code> 以传入 <code class="language-plaintext highlighter-rouge">|</code> 起始的字符串来创建进程的功能被移除。 [<a href="https://bugs.ruby-lang.org/issues/19630">Feature #19630</a>]</p> </li> </ul> </li> <li> <p>Math</p> <ul> <li>新增 <code class="language-plaintext highlighter-rouge">Math.log1p</code> 和 <code class="language-plaintext highlighter-rouge">Math.expm1</code>。 [<a href="https://bugs.ruby-lang.org/issues/21527">Feature #21527</a>]</li> </ul> </li> <li> <p>Pathname</p> <ul> <li>Pathname 从默认 gem 提升为 Ruby 核心类。 [<a href="https://bugs.ruby-lang.org/issues/17473">Feature #17473</a>]</li> </ul> </li> <li> <p>Proc</p> <ul> <li><code class="language-plaintext highlighter-rouge">Proc#parameters</code> 现在将匿名可选参数显示为 <code class="language-plaintext highlighter-rouge">[:opt]</code>,替代原来的 <code class="language-plaintext highlighter-rouge">[:opt, nil]</code>, 使得输出能与需要匿名参数时一致。 [<a href="https://bugs.ruby-lang.org/issues/20974">Bug #20974</a>]</li> </ul> </li> <li> <p>Ractor</p> <ul> <li> <p>新增 <code class="language-plaintext highlighter-rouge">Ractor::Port</code> 类,用于在 Ractor 之间进行通信的新同步机制。 [<a href="https://bugs.ruby-lang.org/issues/21262">Feature #21262</a>]</p> <div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="n">port1</span> <span class="o">=</span> <span class="no">Ractor</span><span class="o">::</span><span class="no">Port</span><span class="p">.</span><span class="nf">new</span> <span class="n">port2</span> <span class="o">=</span> <span class="no">Ractor</span><span class="o">::</span><span class="no">Port</span><span class="p">.</span><span class="nf">new</span> <span class="no">Ractor</span><span class="p">.</span><span class="nf">new</span> <span class="n">port1</span><span class="p">,</span> <span class="n">port2</span> <span class="k">do</span> <span class="o">|</span><span class="n">port1</span><span class="p">,</span> <span class="n">port2</span><span class="o">|</span> <span class="n">port1</span> <span class="o">&lt;&lt;</span> <span class="mi">1</span> <span class="n">port2</span> <span class="o">&lt;&lt;</span> <span class="mi">11</span> <span class="n">port1</span> <span class="o">&lt;&lt;</span> <span class="mi">2</span> <span class="n">port2</span> <span class="o">&lt;&lt;</span> <span class="mi">12</span> <span class="k">end</span> <span class="mi">2</span><span class="p">.</span><span class="nf">times</span><span class="p">{</span> <span class="nb">p</span> <span class="n">port1</span><span class="p">.</span><span class="nf">receive</span> <span class="p">}</span> <span class="c1">#=&gt; 1, 2</span> <span class="mi">2</span><span class="p">.</span><span class="nf">times</span><span class="p">{</span> <span class="nb">p</span> <span class="n">port2</span><span class="p">.</span><span class="nf">receive</span> <span class="p">}</span> <span class="c1">#=&gt; 11, 12</span> </code></pre></div> </div> <p><code class="language-plaintext highlighter-rouge">Ractor::Port</code> 提供以下方法:</p> <ul> <li><code class="language-plaintext highlighter-rouge">Ractor::Port#receive</code></li> <li><code class="language-plaintext highlighter-rouge">Ractor::Port#send</code> (或 <code class="language-plaintext highlighter-rouge">Ractor::Port#&lt;&lt;</code>)</li> <li><code class="language-plaintext highlighter-rouge">Ractor::Port#close</code></li> <li><code class="language-plaintext highlighter-rouge">Ractor::Port#closed?</code></li> </ul> <p>由此,<code class="language-plaintext highlighter-rouge">Ractor.yield</code> 和 <code class="language-plaintext highlighter-rouge">Ractor#take</code> 被移除。</p> </li> <li> <p>新增 <code class="language-plaintext highlighter-rouge">Ractor#join</code> 和 <code class="language-plaintext highlighter-rouge">Ractor#value</code>,用于等待 Ractor 终止。 这类似于 <code class="language-plaintext highlighter-rouge">Thread#join</code> 和 <code class="language-plaintext highlighter-rouge">Thread#value</code>。</p> </li> <li> <p>新增 <code class="language-plaintext highlighter-rouge">Ractor#monitor</code> 和 <code class="language-plaintext highlighter-rouge">Ractor#unmonitor</code> 作为内部使用的底层接口来实现 <code class="language-plaintext highlighter-rouge">Ractor#join</code>。</p> </li> <li> <p><code class="language-plaintext highlighter-rouge">Ractor.select</code> 现在只接受若干个 Ractor 和 Port 作为参数。 如果参数是若干个 Ractor,方法会在最早结束的 Ractor 终止时返回。</p> </li> <li> <p>新增 <code class="language-plaintext highlighter-rouge">Ractor#default_port</code>。每个 <code class="language-plaintext highlighter-rouge">Ractor</code> 都有一个默认端口,用于 <code class="language-plaintext highlighter-rouge">Ractor.send</code>,<code class="language-plaintext highlighter-rouge">Ractor.receive</code>。</p> </li> <li> <p>移除 <code class="language-plaintext highlighter-rouge">Ractor#close_incoming</code> 和 <code class="language-plaintext highlighter-rouge">Ractor#close_outgoing</code>。</p> </li> <li> <p>引入 <code class="language-plaintext highlighter-rouge">Ractor.shareable_proc</code> 和 <code class="language-plaintext highlighter-rouge">Ractor.shareable_lambda</code> 实现可共享的 Proc 或 lambda。 [<a href="https://bugs.ruby-lang.org/issues/21550">Feature #21550</a>], [<a href="https://bugs.ruby-lang.org/issues/21557">Feature #21557</a>]</p> </li> </ul> </li> <li> <p>Range</p> <ul> <li> <p><code class="language-plaintext highlighter-rouge">Range#to_set</code> 现在会先检查大小,来避免无上限 range 的问题。 [<a href="https://bugs.ruby-lang.org/issues/21654">Bug #21654</a>]</p> </li> <li> <p><code class="language-plaintext highlighter-rouge">Range#overlap?</code> 现在可以正确处理无限(无界) range。 [<a href="https://bugs.ruby-lang.org/issues/21185">Bug #21185</a>]</p> </li> <li> <p><code class="language-plaintext highlighter-rouge">Range#max</code> 在无下限整数 range 中的行为已修复。 [<a href="https://bugs.ruby-lang.org/issues/21174">Bug #21174</a>] [<a href="https://bugs.ruby-lang.org/issues/21175">Bug #21175</a>]</p> </li> </ul> </li> <li> <p>Ruby</p> <ul> <li>定义了新的顶级模块 <code class="language-plaintext highlighter-rouge">Ruby</code>,包含了 Ruby 相关的常量,此模块在 Ruby 3.4 中被保留, 现在被正式定义。 [<a href="https://bugs.ruby-lang.org/issues/20884">Feature #20884</a>]</li> </ul> </li> <li> <p>Ruby::Box</p> <ul> <li>这是一项新的(实验性)功能,用于实现定义分离。 关于 “Ruby Box” 的详细信息,请参阅 <a href="https://docs.ruby-lang.org/en/4.0/language/box_md.html">doc/language/box.md</a>。 [<a href="https://bugs.ruby-lang.org/issues/21311">Feature #21311</a>] [<a href="https://bugs.ruby-lang.org/issues/21385">Misc #21385</a>]</li> </ul> </li> <li> <p>Set</p> <ul> <li> <p><code class="language-plaintext highlighter-rouge">Set</code> 现在是一个核心类,不再是自动加载的标准库类。 [<a href="https://bugs.ruby-lang.org/issues/21216">Feature #21216</a>]</p> </li> <li> <p><code class="language-plaintext highlighter-rouge">Set#inspect</code> 现在返回一个更适合 <code class="language-plaintext highlighter-rouge">eval</code> 的字符串, 使用 <code class="language-plaintext highlighter-rouge">Set[]</code> 语法(如: <code class="language-plaintext highlighter-rouge">Set[1, 2, 3]</code>,代替原来的 <code class="language-plaintext highlighter-rouge">#&lt;Set: {1, 2, 3}&gt;</code>)。 [<a href="https://bugs.ruby-lang.org/issues/21389">Feature #21389</a>]</p> </li> <li> <p>声明废弃向方法 <code class="language-plaintext highlighter-rouge">Set#to_set</code> 和 <code class="language-plaintext highlighter-rouge">Enumerable#to_set</code> 传递参数的行为。 [<a href="https://bugs.ruby-lang.org/issues/21390">Feature #21390</a>]</p> </li> </ul> </li> <li> <p>Socket</p> <ul> <li><code class="language-plaintext highlighter-rouge">Socket.tcp</code> 和 <code class="language-plaintext highlighter-rouge">TCPSocket.new</code> 现在能接受关键词参数 <code class="language-plaintext highlighter-rouge">open_timeout</code> 来定义初始连接时的超时时间。 [<a href="https://bugs.ruby-lang.org/issues/21347">Feature #21347</a>]</li> <li>如果用户在 <code class="language-plaintext highlighter-rouge">TCPSocket.new</code> 中指定了超时时间,根据具体情况,<code class="language-plaintext highlighter-rouge">Errno::ETIMEDOUT</code> 或 <code class="language-plaintext highlighter-rouge">IO::TimeoutError</code> 都可能被更早抛出。此行为目前被统一为抛出 <code class="language-plaintext highlighter-rouge">IO::TimeoutError</code>。(请注意,在 <code class="language-plaintext highlighter-rouge">Socket.tcp</code> 中,仍然可能有某些情况下会抛出 <code class="language-plaintext highlighter-rouge">Errno::ETIMEDOUT</code>,同样如果是操作系统层级发生超时,也可能抛出 <code class="language-plaintext highlighter-rouge">Errno::ETIMEDOUT</code>)</li> </ul> </li> <li> <p>String</p> <ul> <li> <p>更新 Unicode 版本至 17.0.0,更新 Emoji 版本至 17.0。 [<a href="https://bugs.ruby-lang.org/issues/19908">Feature #19908</a>][<a href="https://bugs.ruby-lang.org/issues/20724">Feature #20724</a>][<a href="https://bugs.ruby-lang.org/issues/21275">Feature #21275</a>] (同样适用于 Regexp)</p> </li> <li> <p>扩展 <code class="language-plaintext highlighter-rouge">String#strip</code>,<code class="language-plaintext highlighter-rouge">strip!</code>,<code class="language-plaintext highlighter-rouge">lstrip</code>,<code class="language-plaintext highlighter-rouge">lstrip!</code>,<code class="language-plaintext highlighter-rouge">rstrip</code> 和 <code class="language-plaintext highlighter-rouge">rstrip!</code> 以接受 <code class="language-plaintext highlighter-rouge">*selectors</code> 参数。 [<a href="https://bugs.ruby-lang.org/issues/21552">Feature #21552</a>]</p> </li> </ul> </li> <li> <p>Thread</p> <ul> <li>引入和 <code class="language-plaintext highlighter-rouge">Kernel#raise</code> 类似的参数支持 <code class="language-plaintext highlighter-rouge">Thread#raise(cause:)</code>。 [<a href="https://bugs.ruby-lang.org/issues/21360">Feature #21360</a>]</li> </ul> </li> </ul> <h2 id="标准库更新">标准库更新</h2> <p>我们只列出了重要的标准库更新。</p> <p>其他变更列在下方。如果 gem 有自己的 GitHub 发布页面,我们还列出了自 Ruby 3.4.0 以来的发布历史。</p> <p>以下默认 gems 提升为绑定 gem。</p> <ul> <li>ostruct 0.6.3 <ul> <li>0.6.1 至 <a href="https://github.com/ruby/ostruct/releases/tag/v0.6.2">v0.6.2</a>, <a href="https://github.com/ruby/ostruct/releases/tag/v0.6.3">v0.6.3</a></li> </ul> </li> <li>pstore 0.2.0 <ul> <li>0.1.4 至 <a href="https://github.com/ruby/pstore/releases/tag/v0.2.0">v0.2.0</a></li> </ul> </li> <li>benchmark 0.5.0 <ul> <li>0.4.0 至 <a href="https://github.com/ruby/benchmark/releases/tag/v0.4.1">v0.4.1</a>, <a href="https://github.com/ruby/benchmark/releases/tag/v0.5.0">v0.5.0</a></li> </ul> </li> <li>logger 1.7.0 <ul> <li>1.6.4 至 <a href="https://github.com/ruby/logger/releases/tag/v1.6.5">v1.6.5</a>, <a href="https://github.com/ruby/logger/releases/tag/v1.6.6">v1.6.6</a>, <a href="https://github.com/ruby/logger/releases/tag/v1.7.0">v1.7.0</a></li> </ul> </li> <li>rdoc 7.0.2 <ul> <li>6.14.0 至 <a href="https://github.com/ruby/rdoc/releases/tag/v6.14.1">v6.14.1</a>, <a href="https://github.com/ruby/rdoc/releases/tag/v6.14.2">v6.14.2</a>, <a href="https://github.com/ruby/rdoc/releases/tag/v6.15.0">v6.15.0</a>, <a href="https://github.com/ruby/rdoc/releases/tag/v6.15.1">v6.15.1</a>, <a href="https://github.com/ruby/rdoc/releases/tag/v6.16.0">v6.16.0</a>, <a href="https://github.com/ruby/rdoc/releases/tag/v6.16.1">v6.16.1</a>, <a href="https://github.com/ruby/rdoc/releases/tag/v6.17.0">v6.17.0</a>, <a href="https://github.com/ruby/rdoc/releases/tag/v7.0.0">v7.0.0</a>, <a href="https://github.com/ruby/rdoc/releases/tag/v7.0.1">v7.0.1</a>, <a href="https://github.com/ruby/rdoc/releases/tag/v7.0.2">v7.0.2</a>, <a href="https://github.com/ruby/rdoc/releases/tag/v7.0.3">v7.0.3</a></li> </ul> </li> <li>win32ole 1.9.2 <ul> <li>1.9.1 至 <a href="https://github.com/ruby/win32ole/releases/tag/v1.9.2">v1.9.2</a></li> </ul> </li> <li>irb 1.16.0 <ul> <li>1.14.3 至 <a href="https://github.com/ruby/irb/releases/tag/v1.15.0">v1.15.0</a>, <a href="https://github.com/ruby/irb/releases/tag/v1.15.1">v1.15.1</a>, <a href="https://github.com/ruby/irb/releases/tag/v1.15.2">v1.15.2</a>, <a href="https://github.com/ruby/irb/releases/tag/v1.15.3">v1.15.3</a>, <a href="https://github.com/ruby/irb/releases/tag/v1.16.0">v1.16.0</a></li> </ul> </li> <li>reline 0.6.3 <ul> <li>0.6.0 至 <a href="https://github.com/ruby/reline/releases/tag/v0.6.1">v0.6.1</a>, <a href="https://github.com/ruby/reline/releases/tag/v0.6.2">v0.6.2</a>, <a href="https://github.com/ruby/reline/releases/tag/v0.6.3">v0.6.3</a></li> </ul> </li> <li>readline 0.0.4</li> <li>fiddle 1.1.8 <ul> <li>1.1.6 至 <a href="https://github.com/ruby/fiddle/releases/tag/v1.1.7">v1.1.7</a>, <a href="https://github.com/ruby/fiddle/releases/tag/v1.1.8">v1.1.8</a></li> </ul> </li> </ul> <p>新增以下默认 gem。</p> <ul> <li>win32-registry 0.1.2</li> </ul> <p>更新以下默认 gem。</p> <ul> <li>RubyGems 4.0.3</li> <li>bundler 4.0.3</li> <li>date 3.5.1 <ul> <li>3.4.1 至 <a href="https://github.com/ruby/date/releases/tag/v3.5.0">v3.5.0</a>, <a href="https://github.com/ruby/date/releases/tag/v3.5.1">v3.5.1</a></li> </ul> </li> <li>delegate 0.6.1 <ul> <li>0.4.0 至 <a href="https://github.com/ruby/delegate/releases/tag/v0.5.0">v0.5.0</a>, <a href="https://github.com/ruby/delegate/releases/tag/v0.6.0">v0.6.0</a>, <a href="https://github.com/ruby/delegate/releases/tag/v0.6.1">v0.6.1</a></li> </ul> </li> <li>digest 3.2.1 <ul> <li>3.2.0 至 <a href="https://github.com/ruby/digest/releases/tag/v3.2.1">v3.2.1</a></li> </ul> </li> <li>english 0.8.1 <ul> <li>0.8.0 至 <a href="https://github.com/ruby/english/releases/tag/v0.8.1">v0.8.1</a></li> </ul> </li> <li>erb 6.0.1 <ul> <li>4.0.4 至 <a href="https://github.com/ruby/erb/releases/tag/v5.1.2">v5.1.2</a>, <a href="https://github.com/ruby/erb/releases/tag/v5.1.3">v5.1.3</a>, <a href="https://github.com/ruby/erb/releases/tag/v6.0.0">v6.0.0</a>, <a href="https://github.com/ruby/erb/releases/tag/v6.0.1">v6.0.1</a></li> </ul> </li> <li>error_highlight 0.7.1</li> <li>etc 1.4.6</li> <li>fcntl 1.3.0 <ul> <li>1.2.0 至 <a href="https://github.com/ruby/fcntl/releases/tag/v1.3.0">v1.3.0</a></li> </ul> </li> <li>fileutils 1.8.0 <ul> <li>1.7.3 至 <a href="https://github.com/ruby/fileutils/releases/tag/v1.8.0">v1.8.0</a></li> </ul> </li> <li>forwardable 1.4.0 <ul> <li>1.3.3 至 <a href="https://github.com/ruby/forwardable/releases/tag/v1.4.0">v1.4.0</a></li> </ul> </li> <li>io-console 0.8.2 <ul> <li>0.8.1 至 <a href="https://github.com/ruby/io-console/releases/tag/v0.8.2">v0.8.2</a></li> </ul> </li> <li>io-nonblock 0.3.2</li> <li>io-wait 0.4.0 <ul> <li>0.3.2 至 <a href="https://github.com/ruby/io-wait/releases/tag/v0.3.3">v0.3.3</a>, <a href="https://github.com/ruby/io-wait/releases/tag/v0.3.5.test1">v0.3.5.test1</a>, <a href="https://github.com/ruby/io-wait/releases/tag/v0.3.5">v0.3.5</a>, <a href="https://github.com/ruby/io-wait/releases/tag/v0.3.6">v0.3.6</a>, <a href="https://github.com/ruby/io-wait/releases/tag/v0.4.0">v0.4.0</a></li> </ul> </li> <li>ipaddr 1.2.8</li> <li>json 2.18.0 <ul> <li>2.9.1 至 <a href="https://github.com/ruby/json/releases/tag/v2.10.0">v2.10.0</a>, <a href="https://github.com/ruby/json/releases/tag/v2.10.1">v2.10.1</a>, <a href="https://github.com/ruby/json/releases/tag/v2.10.2">v2.10.2</a>, <a href="https://github.com/ruby/json/releases/tag/v2.11.0">v2.11.0</a>, <a href="https://github.com/ruby/json/releases/tag/v2.11.1">v2.11.1</a>, <a href="https://github.com/ruby/json/releases/tag/v2.11.2">v2.11.2</a>, <a href="https://github.com/ruby/json/releases/tag/v2.11.3">v2.11.3</a>, <a href="https://github.com/ruby/json/releases/tag/v2.12.0">v2.12.0</a>, <a href="https://github.com/ruby/json/releases/tag/v2.12.1">v2.12.1</a>, <a href="https://github.com/ruby/json/releases/tag/v2.12.2">v2.12.2</a>, <a href="https://github.com/ruby/json/releases/tag/v2.13.0">v2.13.0</a>, <a href="https://github.com/ruby/json/releases/tag/v2.13.1">v2.13.1</a>, <a href="https://github.com/ruby/json/releases/tag/v2.13.2">v2.13.2</a>, <a href="https://github.com/ruby/json/releases/tag/v2.14.0">v2.14.0</a>, <a href="https://github.com/ruby/json/releases/tag/v2.14.1">v2.14.1</a>, <a href="https://github.com/ruby/json/releases/tag/v2.15.0">v2.15.0</a>, <a href="https://github.com/ruby/json/releases/tag/v2.15.1">v2.15.1</a>, <a href="https://github.com/ruby/json/releases/tag/v2.15.2">v2.15.2</a>, <a href="https://github.com/ruby/json/releases/tag/v2.16.0">v2.16.0</a>, <a href="https://github.com/ruby/json/releases/tag/v2.17.0">v2.17.0</a>, <a href="https://github.com/ruby/json/releases/tag/v2.17.1">v2.17.1</a>, <a href="https://github.com/ruby/json/releases/tag/v2.18.0">v2.18.0</a></li> </ul> </li> <li>net-http 0.9.1 <ul> <li>0.6.0 至 <a href="https://github.com/ruby/net-http/releases/tag/v0.7.0">v0.7.0</a>, <a href="https://github.com/ruby/net-http/releases/tag/v0.8.0">v0.8.0</a>, <a href="https://github.com/ruby/net-http/releases/tag/v0.9.0">v0.9.0</a>, <a href="https://github.com/ruby/net-http/releases/tag/v0.9.1">v0.9.1</a></li> </ul> </li> <li>openssl 4.0.0 <ul> <li>3.3.1 至 <a href="https://github.com/ruby/openssl/releases/tag/v3.3.2">v3.3.2</a>, <a href="https://github.com/ruby/openssl/releases/tag/v4.0.0">v4.0.0</a></li> </ul> </li> <li>optparse 0.8.1 <ul> <li>0.6.0 至 <a href="https://github.com/ruby/optparse/releases/tag/v0.7.0">v0.7.0</a>, <a href="https://github.com/ruby/optparse/releases/tag/v0.8.0">v0.8.0</a>, <a href="https://github.com/ruby/optparse/releases/tag/v0.8.1">v0.8.1</a></li> </ul> </li> <li>pp 0.6.3 <ul> <li>0.6.2 至 <a href="https://github.com/ruby/pp/releases/tag/v0.6.3">v0.6.3</a></li> </ul> </li> <li>prism 1.7.0 <ul> <li>1.5.2 至 <a href="https://github.com/ruby/prism/releases/tag/v1.6.0">v1.6.0</a>, <a href="https://github.com/ruby/prism/releases/tag/v1.7.0">v1.7.0</a></li> </ul> </li> <li>psych 5.3.1 <ul> <li>5.2.2 至 <a href="https://github.com/ruby/psych/releases/tag/v5.2.3">v5.2.3</a>, <a href="https://github.com/ruby/psych/releases/tag/v5.2.4">v5.2.4</a>, <a href="https://github.com/ruby/psych/releases/tag/v5.2.5">v5.2.5</a>, <a href="https://github.com/ruby/psych/releases/tag/v5.2.6">v5.2.6</a>, <a href="https://github.com/ruby/psych/releases/tag/v5.3.0">v5.3.0</a>, <a href="https://github.com/ruby/psych/releases/tag/v5.3.1">v5.3.1</a></li> </ul> </li> <li>resolv 0.7.0 <ul> <li>0.6.2 至 <a href="https://github.com/ruby/resolv/releases/tag/v0.6.3">v0.6.3</a>, <a href="https://github.com/ruby/resolv/releases/tag/v0.7.0">v0.7.0</a></li> </ul> </li> <li>stringio 3.2.0 <ul> <li>3.1.2 至 <a href="https://github.com/ruby/stringio/releases/tag/v3.1.3">v3.1.3</a>, <a href="https://github.com/ruby/stringio/releases/tag/v3.1.4">v3.1.4</a>, <a href="https://github.com/ruby/stringio/releases/tag/v3.1.5">v3.1.5</a>, <a href="https://github.com/ruby/stringio/releases/tag/v3.1.6">v3.1.6</a>, <a href="https://github.com/ruby/stringio/releases/tag/v3.1.7">v3.1.7</a>, <a href="https://github.com/ruby/stringio/releases/tag/v3.1.8">v3.1.8</a>, <a href="https://github.com/ruby/stringio/releases/tag/v3.1.9">v3.1.9</a>, <a href="https://github.com/ruby/stringio/releases/tag/v3.2.0">v3.2.0</a></li> </ul> </li> <li>strscan 3.1.6 <ul> <li>3.1.2 至 <a href="https://github.com/ruby/strscan/releases/tag/v3.1.3">v3.1.3</a>, <a href="https://github.com/ruby/strscan/releases/tag/v3.1.4">v3.1.4</a>, <a href="https://github.com/ruby/strscan/releases/tag/v3.1.5">v3.1.5</a>, <a href="https://github.com/ruby/strscan/releases/tag/v3.1.6">v3.1.6</a></li> </ul> </li> <li>time 0.4.2 <ul> <li>0.4.1 至 <a href="https://github.com/ruby/time/releases/tag/v0.4.2">v0.4.2</a></li> </ul> </li> <li>timeout 0.6.0 <ul> <li>0.4.3 至 <a href="https://github.com/ruby/timeout/releases/tag/v0.4.4">v0.4.4</a>, <a href="https://github.com/ruby/timeout/releases/tag/v0.5.0">v0.5.0</a>, <a href="https://github.com/ruby/timeout/releases/tag/v0.6.0">v0.6.0</a></li> </ul> </li> <li>uri 1.1.1 <ul> <li>1.0.4 至 <a href="https://github.com/ruby/uri/releases/tag/v1.1.0">v1.1.0</a>, <a href="https://github.com/ruby/uri/releases/tag/v1.1.1">v1.1.1</a></li> </ul> </li> <li>weakref 0.1.4 <ul> <li>0.1.3 至 <a href="https://github.com/ruby/weakref/releases/tag/v0.1.4">v0.1.4</a></li> </ul> </li> <li>zlib 3.2.2 <ul> <li>3.2.1 至 <a href="https://github.com/ruby/zlib/releases/tag/v3.2.2">v3.2.2</a></li> </ul> </li> </ul> <p>更新以下绑定 gem。</p> <ul> <li>minitest 6.0.0</li> <li>power_assert 3.0.1 <ul> <li>2.0.5 至 <a href="https://github.com/ruby/power_assert/releases/tag/v3.0.0">v3.0.0</a>, <a href="https://github.com/ruby/power_assert/releases/tag/v3.0.1">v3.0.1</a></li> </ul> </li> <li>rake 13.3.1 <ul> <li>13.2.1 至 <a href="https://github.com/ruby/rake/releases/tag/v13.3.0">v13.3.0</a>, <a href="https://github.com/ruby/rake/releases/tag/v13.3.1">v13.3.1</a></li> </ul> </li> <li>test-unit 3.7.3 <ul> <li>3.6.7 至 <a href="https://github.com/test-unit/test-unit/releases/tag/3.6.8">3.6.8</a>, <a href="https://github.com/test-unit/test-unit/releases/tag/3.6.9">3.6.9</a>, <a href="https://github.com/test-unit/test-unit/releases/tag/3.7.0">3.7.0</a>, <a href="https://github.com/test-unit/test-unit/releases/tag/3.7.1">3.7.1</a>, <a href="https://github.com/test-unit/test-unit/releases/tag/3.7.2">3.7.2</a>, <a href="https://github.com/test-unit/test-unit/releases/tag/3.7.3">3.7.3</a>, <a href="https://github.com/test-unit/test-unit/releases/tag/3.7.4">3.7.4</a>, <a href="https://github.com/test-unit/test-unit/releases/tag/3.7.5">3.7.5</a></li> </ul> </li> <li>rexml 3.4.4</li> <li>rss 0.3.2 <ul> <li>0.3.1 至 <a href="https://github.com/ruby/rss/releases/tag/0.3.2">0.3.2</a></li> </ul> </li> <li>net-ftp 0.3.9 <ul> <li>0.3.8 至 <a href="https://github.com/ruby/net-ftp/releases/tag/v0.3.9">v0.3.9</a></li> </ul> </li> <li>net-imap 0.6.2 <ul> <li>0.5.8 至 <a href="https://github.com/ruby/net-imap/releases/tag/v0.5.9">v0.5.9</a>, <a href="https://github.com/ruby/net-imap/releases/tag/v0.5.10">v0.5.10</a>, <a href="https://github.com/ruby/net-imap/releases/tag/v0.5.11">v0.5.11</a>, <a href="https://github.com/ruby/net-imap/releases/tag/v0.5.12">v0.5.12</a>, <a href="https://github.com/ruby/net-imap/releases/tag/v0.5.13">v0.5.13</a>, <a href="https://github.com/ruby/net-imap/releases/tag/v0.6.0">v0.6.0</a>, <a href="https://github.com/ruby/net-imap/releases/tag/v0.6.1">v0.6.1</a>, <a href="https://github.com/ruby/net-imap/releases/tag/v0.6.2">v0.6.2</a></li> </ul> </li> <li>net-smtp 0.5.1 <ul> <li>0.5.0 至 <a href="https://github.com/ruby/net-smtp/releases/tag/v0.5.1">v0.5.1</a></li> </ul> </li> <li>matrix 0.4.3 <ul> <li>0.4.2 至 <a href="https://github.com/ruby/matrix/releases/tag/v0.4.3">v0.4.3</a></li> </ul> </li> <li>prime 0.1.4 <ul> <li>0.1.3 至 <a href="https://github.com/ruby/prime/releases/tag/v0.1.4">v0.1.4</a></li> </ul> </li> <li>rbs 3.10.0 <ul> <li>3.8.0 至 <a href="https://github.com/ruby/rbs/releases/tag/v3.8.1">v3.8.1</a>, <a href="https://github.com/ruby/rbs/releases/tag/v3.9.0.dev.1">v3.9.0.dev.1</a>, <a href="https://github.com/ruby/rbs/releases/tag/v3.9.0.pre.1">v3.9.0.pre.1</a>, <a href="https://github.com/ruby/rbs/releases/tag/v3.9.0.pre.2">v3.9.0.pre.2</a>, <a href="https://github.com/ruby/rbs/releases/tag/v3.9.0">v3.9.0</a>, <a href="https://github.com/ruby/rbs/releases/tag/v3.9.1">v3.9.1</a>, <a href="https://github.com/ruby/rbs/releases/tag/v3.9.2">v3.9.2</a>, <a href="https://github.com/ruby/rbs/releases/tag/v3.9.3">v3.9.3</a>, <a href="https://github.com/ruby/rbs/releases/tag/v3.9.4">v3.9.4</a>, <a href="https://github.com/ruby/rbs/releases/tag/v3.9.5">v3.9.5</a>, <a href="https://github.com/ruby/rbs/releases/tag/v3.10.0.pre.1">v3.10.0.pre.1</a>, <a href="https://github.com/ruby/rbs/releases/tag/v3.10.0.pre.2">v3.10.0.pre.2</a>, <a href="https://github.com/ruby/rbs/releases/tag/v3.10.0">v3.10.0</a></li> </ul> </li> <li>typeprof 0.31.1</li> <li>debug 1.11.1 <ul> <li>1.11.0 至 <a href="https://github.com/ruby/debug/releases/tag/v1.11.1">v1.11.1</a></li> </ul> </li> <li>base64 0.3.0 <ul> <li>0.2.0 至 <a href="https://github.com/ruby/base64/releases/tag/v0.3.0">v0.3.0</a></li> </ul> </li> <li>bigdecimal 4.0.1 <ul> <li>3.1.8 至 <a href="https://github.com/ruby/bigdecimal/releases/tag/v3.2.0">v3.2.0</a>, <a href="https://github.com/ruby/bigdecimal/releases/tag/v3.2.1">v3.2.1</a>, <a href="https://github.com/ruby/bigdecimal/releases/tag/v3.2.2">v3.2.2</a>, <a href="https://github.com/ruby/bigdecimal/releases/tag/v3.2.3">v3.2.3</a>, <a href="https://github.com/ruby/bigdecimal/releases/tag/v3.3.0">v3.3.0</a>, <a href="https://github.com/ruby/bigdecimal/releases/tag/v3.3.1">v3.3.1</a>, <a href="https://github.com/ruby/bigdecimal/releases/tag/v4.0.0">v4.0.0</a>, <a href="https://github.com/ruby/bigdecimal/releases/tag/v4.0.1">v4.0.1</a></li> </ul> </li> <li>drb 2.2.3 <ul> <li>2.2.1 至 <a href="https://github.com/ruby/drb/releases/tag/v2.2.3">v2.2.3</a></li> </ul> </li> <li>syslog 0.3.0 <ul> <li>0.2.0 至 <a href="https://github.com/ruby/syslog/releases/tag/v0.3.0">v0.3.0</a></li> </ul> </li> <li>csv 3.3.5 <ul> <li>3.3.2 至 <a href="https://github.com/ruby/csv/releases/tag/v3.3.3">v3.3.3</a>, <a href="https://github.com/ruby/csv/releases/tag/v3.3.4">v3.3.4</a>, <a href="https://github.com/ruby/csv/releases/tag/v3.3.5">v3.3.5</a></li> </ul> </li> <li>repl_type_completor 0.1.12</li> </ul> <h3 id="rubygems-和-bundler">RubyGems 和 Bundler</h3> <p>Ruby 4.0 绑定了 RubyGems 和 Bundler 版本 4。您可以通过下面的链接查看详情。</p> <ul> <li><a href="https://blog.rubygems.org/2025/12/03/upgrade-to-rubygems-bundler-4.html">更新至 RubyGems/Bundler 4 - RubyGems 博客</a></li> <li><a href="https://blog.rubygems.org/2025/12/03/4.0.0-released.html">4.0.0 已发布 - RubyGems 博客</a></li> <li><a href="https://blog.rubygems.org/2025/12/09/4.0.1-released.html">4.0.1 已发布 - RubyGems 博客</a></li> <li><a href="https://blog.rubygems.org/2025/12/17/4.0.2-released.html">4.0.2 已发布 - RubyGems 博客</a></li> <li><a href="https://blog.rubygems.org/2025/12/23/4.0.3-released.html">4.0.3 已发布 - RubyGems 博客</a></li> </ul> <h2 id="支持平台">支持平台</h2> <ul> <li> <p>Windows</p> <ul> <li>不再支持 14.0(_MSC_VER 1900)之前的 MSVC 版本。 这意味着现在需要 Visual Studio 2015 或更高版本。</li> </ul> </li> </ul> <h2 id="兼容性问题">兼容性问题</h2> <ul> <li> <p>由于新增了 <code class="language-plaintext highlighter-rouge">Ractor::Port</code>,以下方法从 Ractor 中被移除:</p> <ul> <li><code class="language-plaintext highlighter-rouge">Ractor.yield</code></li> <li><code class="language-plaintext highlighter-rouge">Ractor#take</code></li> <li><code class="language-plaintext highlighter-rouge">Ractor#close_incoming</code></li> <li><code class="language-plaintext highlighter-rouge">Ractor#close_outgoging</code></li> </ul> <p>[<a href="https://bugs.ruby-lang.org/issues/21262">Feature #21262</a>]</p> </li> <li> <p>声明废弃 <code class="language-plaintext highlighter-rouge">ObjectSpace._id2ref</code>。 [<a href="https://bugs.ruby-lang.org/issues/15408">Feature #15408</a>]</p> </li> <li> <p>移除 <code class="language-plaintext highlighter-rouge">Process::Status#&amp;</code> 和 <code class="language-plaintext highlighter-rouge">Process::Status#&gt;&gt;</code>,他们已在 Ruby 3.3 中声明废弃。 [<a href="https://bugs.ruby-lang.org/issues/19868">Bug #19868</a>]</p> </li> <li> <p>移除 <code class="language-plaintext highlighter-rouge">rb_path_check</code>。此方法原用来检查已在 Ruby 2.7 中移除的 <code class="language-plaintext highlighter-rouge">$SAFE</code> 路径。 [<a href="https://bugs.ruby-lang.org/issues/20971">Feature #20971</a>]</p> </li> <li> <p><code class="language-plaintext highlighter-rouge">ArgumentError</code> 中,”wrong number of arguments” 现在会包含被调用方法的类或模块名。 (如:<code class="language-plaintext highlighter-rouge">Foo#bar</code> 替代原来的 <code class="language-plaintext highlighter-rouge">bar</code>)。 [<a href="https://bugs.ruby-lang.org/issues/21698">Bug #21698</a>]</p> </li> <li> <p>错误栈现在不再展示 <code class="language-plaintext highlighter-rouge">internal</code> 帧。这些方法现在看起来像是在 Ruby 源文件中,与其他 C 语言实现的方法保持一致。 [<a href="https://bugs.ruby-lang.org/issues/20968">Bug #20968</a>]</p> <p>此前:</p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ruby -e '[1].fetch_values(42)' &lt;internal:array&gt;:211:in 'Array#fetch': index 42 outside of array bounds: -1...1 (IndexError) from &lt;internal:array&gt;:211:in 'block in Array#fetch_values' from &lt;internal:array&gt;:211:in 'Array#map!' from &lt;internal:array&gt;:211:in 'Array#fetch_values' from -e:1:in '&lt;main&gt;' </code></pre></div> </div> <p>现在:</p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ ruby -e '[1].fetch_values(42)' -e:1:in 'Array#fetch_values': index 42 outside of array bounds: -1...1 (IndexError) from -e:1:in '&lt;main&gt;' </code></pre></div> </div> </li> </ul> <h2 id="标准库兼容性问题">标准库兼容性问题</h2> <ul> <li> <p>CGI 库从默认 gems 中移除。现在 <code class="language-plaintext highlighter-rouge">cgi/escape</code> 仅提供下列方法:</p> <ul> <li><code class="language-plaintext highlighter-rouge">CGI.escape</code> 和 <code class="language-plaintext highlighter-rouge">CGI.unescape</code></li> <li><code class="language-plaintext highlighter-rouge">CGI.escapeHTML</code> 和 <code class="language-plaintext highlighter-rouge">CGI.unescapeHTML</code></li> <li><code class="language-plaintext highlighter-rouge">CGI.escapeURIComponent</code> 和 <code class="language-plaintext highlighter-rouge">CGI.unescapeURIComponent</code></li> <li><code class="language-plaintext highlighter-rouge">CGI.escapeElement</code> 和 <code class="language-plaintext highlighter-rouge">CGI.unescapeElement</code></li> </ul> <p>[<a href="https://bugs.ruby-lang.org/issues/21258">Feature #21258</a>]</p> </li> <li> <p>随着 <code class="language-plaintext highlighter-rouge">Set</code> 类从标准库升为核型类,<code class="language-plaintext highlighter-rouge">set/sorted_set.rb</code> 被移除。 <code class="language-plaintext highlighter-rouge">SortedSet</code> 不再是自动加载的常量。 如需使用 <code class="language-plaintext highlighter-rouge">SortedSet</code>,请先安装 <code class="language-plaintext highlighter-rouge">sorted_set</code> gem,然后执行 <code class="language-plaintext highlighter-rouge">require 'sorted_set'</code>。 [<a href="https://bugs.ruby-lang.org/issues/21287">Feature #21287</a>]</p> </li> <li> <p>Net::HTTP</p> <ul> <li>此前,在发送带有 body 的请求(如:<code class="language-plaintext highlighter-rouge">POST</code>,<code class="language-plaintext highlighter-rouge">PUT</code>)时,如果没有明确制定, 那么 HTTP 头 <code class="language-plaintext highlighter-rouge">Content-Type</code> 会被自动设置为 <code class="language-plaintext highlighter-rouge">application/x-www-form-urlencoded</code>。 此行为现在被移除。如果您的应用依赖这个默认行为,那么您的请求现在将缺失 <code class="language-plaintext highlighter-rouge">Content-Type</code> 头, 这可能导致在与特定服务器交互时出现兼容性错误。 [<a href="https://github.com/ruby/net-http/issues/205">GH-net-http #205</a>]</li> </ul> </li> </ul> <h2 id="c-api-更新">C API 更新</h2> <ul> <li> <p>IO</p> <ul> <li><code class="language-plaintext highlighter-rouge">rb_thread_fd_close</code> 已声明废弃,如果执行将不产生任何效果。 如果您需要将 C 扩展的文件描述符暴露给 Ruby 代码,可以创建一个使用 <code class="language-plaintext highlighter-rouge">RUBY_IO_MODE_EXTERNAL</code> 的 <code class="language-plaintext highlighter-rouge">IO</code> 实例,然后使用 <code class="language-plaintext highlighter-rouge">rb_io_close(io)</code> 进行关闭(此操作也会中断并等待该 <code class="language-plaintext highlighter-rouge">IO</code> 上所有的待处理操作)。 直接关闭文件描述符不会中断待处理操作,可能会导致未定义的行为。换言之,如果两个 <code class="language-plaintext highlighter-rouge">IO</code> 对象共享相同的文件描述符, 则关闭一个不会影响另一个。 [<a href="https://bugs.ruby-lang.org/issues/18455">Feature #18455</a>]</li> </ul> </li> <li> <p>GVL</p> <ul> <li>现在,无论是否使用 GVL,<code class="language-plaintext highlighter-rouge">rb_thread_call_with_gvl</code> 都可以正常工作。 这使得 gem 可以避免检查 <code class="language-plaintext highlighter-rouge">ruby_thread_has_gvl_p</code>。 但仍请谨慎对待 GVL。 [<a href="https://bugs.ruby-lang.org/issues/20750">Feature #20750</a>]</li> </ul> </li> <li> <p>Set</p> <ul> <li> <p>新增一组用于 <code class="language-plaintext highlighter-rouge">Set</code> 的 C API。 支持以下方法: [<a href="https://bugs.ruby-lang.org/issues/21459">Feature #21459</a>]</p> <ul> <li><code class="language-plaintext highlighter-rouge">rb_set_foreach</code></li> <li><code class="language-plaintext highlighter-rouge">rb_set_new</code></li> <li><code class="language-plaintext highlighter-rouge">rb_set_new_capa</code></li> <li><code class="language-plaintext highlighter-rouge">rb_set_lookup</code></li> <li><code class="language-plaintext highlighter-rouge">rb_set_add</code></li> <li><code class="language-plaintext highlighter-rouge">rb_set_clear</code></li> <li><code class="language-plaintext highlighter-rouge">rb_set_delete</code></li> <li><code class="language-plaintext highlighter-rouge">rb_set_size</code></li> </ul> </li> </ul> </li> </ul> <h2 id="实现改进">实现改进</h2> <ul> <li><code class="language-plaintext highlighter-rouge">Class#new</code>(如:<code class="language-plaintext highlighter-rouge">Object.new</code>)在所有情况下都更快,尤其是在传递关键字参数时。此功能同时被集成到 YJIT 和 ZJIT 中。[<a href="https://bugs.ruby-lang.org/issues/21254">Feature #21254</a>]</li> <li>不同大小的 GC 堆现在独立增长。当只有某些池包含长期活跃对象时,将减少内存使用量。</li> <li>GC 清除包含大对象的页面的速度更快。</li> <li>“泛型 ivar” 对象(String,Array,<code class="language-plaintext highlighter-rouge">TypedData</code>等)现在使用新内部 “fields” 对象来加速实例变量的访问。</li> <li>在初次使用前,GC 会避免维护内部的 <code class="language-plaintext highlighter-rouge">id2ref</code> 表,提升 <code class="language-plaintext highlighter-rouge">object_id</code> 的分配和 GC 清除速度。</li> <li>类和模块对象的 <code class="language-plaintext highlighter-rouge">object_id</code> 和 <code class="language-plaintext highlighter-rouge">hash</code> 方法更快。</li> <li>较大的大整数可以通过可变宽度分配保持嵌入状态。</li> <li><code class="language-plaintext highlighter-rouge">Random</code>,<code class="language-plaintext highlighter-rouge">Enumerator::Product</code>,<code class="language-plaintext highlighter-rouge">Enumerator::Chain</code>,<code class="language-plaintext highlighter-rouge">Addrinfo</code>,<code class="language-plaintext highlighter-rouge">StringScanner</code> 以及一些内部对象现在处于写屏障保护中,从而减少 GC 开销。</li> </ul> <h3 id="ractor">Ractor</h3> <p>为了让 Ractor 更加稳定、高效、易用,我们投入了大量的工作。 这些改进让 Ractor 的实现逐渐完整,并即将离开实验性状态。</p> <ul> <li>性能提升 <ul> <li>冻结字符串和符号表在内部使用了无锁哈希集合 [<a href="https://bugs.ruby-lang.org/issues/21268">Feature #21268</a>]</li> <li>方法缓存查找在多数场景下可以避免锁定</li> <li>类(以及一般实例变量)实例变量访问速度更快,并且可以避免锁定</li> <li>通过为每个 ractor 使用计数器,降低对象内存分配时的 CPU 缓存争用</li> <li>通过使用线程本地计数器,减少 xmallloc/xfree 中的 CPU 缓存争用</li> <li>在多数场景下 <code class="language-plaintext highlighter-rouge">object_id</code> 能避免锁定</li> </ul> </li> <li>错误修复和稳定性提升 <ul> <li>修正了同时使用 Ractors 和进程时的可能死锁情况</li> <li>修正了 Ractor 中 require 和自动载入的问题</li> <li>修正了 Ractors 间的 编码/转码 问题</li> <li>修复了 GC 操作和方法失效中的竞争条件</li> <li>修正了在启动 Ractor 后进行进程分叉的问题</li> <li>Ractor 中的 GC 分配计数现在是准确的</li> <li>修正了 GC 后,TracePoints 不能正常工作的问题 [<a href="https://bugs.ruby-lang.org/issues/19112">Bug #19112</a>]</li> </ul> </li> </ul> <h2 id="jit">JIT</h2> <ul> <li>ZJIT <ul> <li>引入了 <a href="https://docs.ruby-lang.org/en/master/jit/zjit_md.html">实验性的基于方法的 JIT 编译器</a>. ZJIT 可以通过两种方法启用:使用 <code class="language-plaintext highlighter-rouge">--zjit</code> 参数,或者调用 <code class="language-plaintext highlighter-rouge">RubyVM::ZJIT.enable</code>。 构建 Ruby 时,如要包含 ZJIT 支持,需要使用 Rust 1.85.0 或后续版本来构建。</li> <li>从 Ruby 4.0.0 起,ZJIT 比解释器更快,但还不及 YJIT。 我们鼓励尝试 ZJIT,但目前不建议将其用于生产环境。</li> <li>我们的目标是让 ZJIT 比 YJIT 更快,并在 Ruby 4.1 时可用于生产环境。</li> </ul> </li> <li>YJIT <ul> <li><code class="language-plaintext highlighter-rouge">RubyVM::YJIT.runtime_stats</code> <ul> <li><code class="language-plaintext highlighter-rouge">ratio_in_yjit</code> 在标准构建中不可用。 可以在 <code class="language-plaintext highlighter-rouge">configure</code> 中设置 <code class="language-plaintext highlighter-rouge">--enable-yjit=stats</code> 并在调用时通过 <code class="language-plaintext highlighter-rouge">--yjit-stats</code> 来启用。</li> <li>在默认统计中新增 <code class="language-plaintext highlighter-rouge">invalidate_everything</code>,当 TracePoint 失效代码时,此统计信息会递增。</li> </ul> </li> <li><code class="language-plaintext highlighter-rouge">RubyVM::YJIT.enable</code> 新增选项 <code class="language-plaintext highlighter-rouge">mem_size:</code> 和 <code class="language-plaintext highlighter-rouge">call_threshold:</code>。</li> </ul> </li> <li>RJIT <ul> <li>移除 <code class="language-plaintext highlighter-rouge">--rjit</code>。我们将把第三方 JIT API 实现迁移到 <a href="https://github.com/ruby/rjit">ruby/rjit</a> 代码库。</li> </ul> </li> </ul> <p>更多详情,可参见 <a href="https://docs.ruby-lang.org/en/4.0/NEWS_md.html">新闻</a> 或 <a href="https://github.com/ruby/ruby/compare/v3_4_0...v4.0.0">提交日志</a>。</p> <p>自 Ruby 3.4.0 以来,这些变化共导致 <a href="https://github.com/ruby/ruby/compare/v3_4_0...v4.0.0#file_bucket">3889 个文件被更改,新增 230769 行(+),删除 297003 行(-)</a>!</p> <p>圣诞快乐,新年快乐,一起来享受 Ruby 4.0 的编程乐趣!</p> <h2 id="下载">下载</h2> <ul> <li> <p><a href="https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0.tar.gz">https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0.tar.gz</a></p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>文件大小: 23955109 SHA1: 754e39e9ad122e1b6deaed860350bac133a35ed3 SHA256: 2e8389c8c072cb658c93a1372732d9eac84082c88b065750db1e52a5ac630271 SHA512: 688254e939b197d564e896fb951bc1abf07142f489e91c5ed0b11f68f52d6adb6b1f86616fe03f1f0bb434beeef7e75e158b9c616afb39bb34403b0b78d2ee19 </code></pre></div> </div> </li> <li> <p><a href="https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0.tar.xz">https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0.tar.xz</a></p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>文件大小: 18008368 SHA1: 05ec670e86f84325c5353ef2f2888e53b6adc602 SHA256: a72bacee9de07283ebc19baa4ac243b193129f21aa4e168c7186fb1fe7d07fe1 SHA512: 2d5b2e566eaf70a5f3ea6ce6afc0611c0415de58a41336ef7a0b855c9a91eda9aa790a5f8b48e40a1eb9d50f8ea0f687216e617f16c8d040a08474f3116518a4 </code></pre></div> </div> </li> <li> <p><a href="https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0.zip">https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0.zip</a></p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>文件大小: 29253204 SHA1: 0b69f89d1d140157251c0d3a6032f6c45cdf81e8 SHA256: 70cb1bf89279b86ab9a975d504607c051fc05ee03e311d550a5541b65e373455 SHA512: a72e076ef618c0aeb9d20cf22e6fb12fda36809c0064ef0f98153b95a0bac257ef606342444a38f992c4594bf376a4d264686cf597463aa6f111220798784302 </code></pre></div> </div> </li> </ul> <h2 id="ruby-是什么">Ruby 是什么</h2> <p>Ruby 最初由 Matz (松本行弘,Yukihiro Matsumoto) 于 1993 年开发, 现在以开源软件的形式开发。它可以在多个平台上运行,并在全球得到广泛使用,尤其是 Web 开发领域。</p> <p>由 <strong>naruse</strong> 发表于 2025-12-25<br />翻译: GAO Jun</p> Thu, 25 Dec 2025 00:00:00 +0000 https://www.ruby-lang.org/zh_cn/news/2025/12/25/ruby-4-0-0-released/ https://www.ruby-lang.org/zh_cn/news/2025/12/25/ruby-4-0-0-released/ 全新的 Ruby 文档界面 <p>继 <a href="https://www.ruby-lang.org/zh_cn/news/2025/12/22/redesign-site-identity/">重新设计 ruby-lang.org</a>之后, 我们还有更多消息来庆祝 Ruby 诞生 30 周年:<a href="https://docs.ruby-lang.org/en/master/">docs.ruby-lang.org</a> 采用了全新的、<a href="https://github.com/ruby/rdoc">RDoc</a> 的 Aliki 默认主题。</p> <h2 id="全新的-ruby-文档界面">全新的 Ruby 文档界面</h2> <p>一直以来,编写 Ruby 程序让人愉悦,现在阅读 Ruby 文档也能带来相似的感受。Aliki 为 <a href="https://docs.ruby-lang.org/en/master/">docs.ruby-lang.org</a> 及所有通过 RDoc v7.0+ 生成文档的 gem 带来了现代、简介的文档界面。</p> <h2 id="主要特点">主要特点</h2> <ul> <li><strong>改进搜索功能</strong>: 根据大小写匹配设置权重,模糊匹配,支持常量搜索</li> <li><strong>深色模式</strong>: 遵从操作系统的偏好设置,也可手动切换</li> <li><strong>三栏布局</strong>: 左侧栏用于导航,中间栏显示内容,右侧栏显示目录</li> <li><strong>代码块改进</strong>: 在代码块上增加复制按钮,支持 C 语言语法高亮</li> <li><strong>自定义脚注</strong>: Gem 维护者可以增加指向代码库、问题跟踪和其他资源的链接</li> </ul> <h2 id="致-gem-作者">致 Gem 作者</h2> <p>如果您使用 RDoc 7.0+ 来生成文档,您的用户就会看到 Aliki 主题。您可以通过 <code class="language-plaintext highlighter-rouge">.rdoc_options</code> 文件来定制脚注链接或切换回 Darkfish 主题。</p> <h2 id="快试试">快试试</h2> <p>访问 <a href="https://docs.ruby-lang.org/en/master/">docs.ruby-lang.org</a> 查看新界面的实际效果。</p> <p>如果您发现问题或有任何建议,请在 Github 上 <a href="https://github.com/ruby/rdoc/issues">提交问题报告</a>。</p> <p>由 <strong>Stan Lo</strong> 发表于 2025-12-23<br />翻译: GAO Jun</p> Tue, 23 Dec 2025 00:00:00 +0000 https://www.ruby-lang.org/zh_cn/news/2025/12/23/new-look-for-ruby-documentation/ https://www.ruby-lang.org/zh_cn/news/2025/12/23/new-look-for-ruby-documentation/ 重新设计我们的网站标识 <p>我们激动地宣布网站已经全面改版。此次更新的设计方案由 <a href="https://x.com/ken_c_lo">Taeko Akatsuka (赤塚妙子)</a> 创作。</p> <p>作为更新的一部分,我们重新设计了网站标识:”A language where people gather, a site where people are visible.”</p> <p>30年来,Ruby 语言一直关注“程序员的幸福感”。新的主视觉形象表达了人们围绕在 Ruby 周围的景象。</p> <p>该作品以 Ruby logo 为中心,向外辐射出各种手绘人物,代表着世界各地的开发者通过 Ruby 连接起来,在各自的领域创造价值,同时与熟悉的元素相伴,享受 Ruby 带来的乐趣。</p> <p>在展现 Ruby 的生态、生产力和社区优势的同时,温暖的视觉风格也体现了 Ruby 自诞生以来始终如一的乐趣、亲和力和可触感。我们致力于打造一种其他编程语言网站所不具备的、 Ruby 独有的表达方式。</p> <p>Matz (松本行弘) 强调,除了生态、生产力和社区之外,简洁也是 Ruby 的优势之一。在新设计中,紧随主视觉图之后,展示了 Ruby 代码,以强调其作为编程语言的本质。</p> <p>我们还加入了对社区成员的访谈和照片,让您能感受到编程语言背后的众多贡献者。</p> <p>基于全新设计的网站整体更新仍在进行中,目前仍有许多待完善之处,例如失效链接和内容不一致等问题。我们竭诚欢迎您的反馈。</p> <p>由 <strong>Hiroshi SHIBATA</strong> 发表于 2025-12-22<br />翻译: GAO Jun</p> Mon, 22 Dec 2025 05:46:09 +0000 https://www.ruby-lang.org/zh_cn/news/2025/12/22/redesign-site-identity/ https://www.ruby-lang.org/zh_cn/news/2025/12/22/redesign-site-identity/