<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Gao-Jun (Gao Jun)</title>
    <link>https://ruby-china.org/Gao-Jun</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>https://gems.ruby-china.com/ 变茶壶了</title>
      <description>&lt;ol&gt;
&lt;li&gt;SSL 证书错误，使用的是 *.cdn.myqcloud.com 的证书&lt;/li&gt;
&lt;li&gt;首页面无内容，且返回了 418 I'm a teapot&lt;/li&gt;
&lt;/ol&gt;</description>
      <author>Gao-Jun</author>
      <pubDate>Fri, 27 Feb 2026 15:15:35 +0800</pubDate>
      <link>https://ruby-china.org/topics/44492</link>
      <guid>https://ruby-china.org/topics/44492</guid>
    </item>
    <item>
      <title>Ruby 也开始版本大跃进了，下一个版本是 4.0</title>
      <description>&lt;p&gt;&lt;a href="https://www.ruby-lang.org/zh_cn/news/2025/04/18/ruby-3-5-0-preview1-released/" rel="nofollow" target="_blank" title=""&gt;Preview 1&lt;/a&gt; 的时候还是 3.5.0。&lt;a href="https://www.ruby-lang.org/zh_cn/news/2025/11/17/ruby-4-0-0-preview2-released/" rel="nofollow" target="_blank" title=""&gt;Preview2&lt;/a&gt; 改成 4.0.0 了。和 3.4 相比，暂时没有看到语法上的大变化。&lt;/p&gt;</description>
      <author>Gao-Jun</author>
      <pubDate>Tue, 18 Nov 2025 11:07:40 +0800</pubDate>
      <link>https://ruby-china.org/topics/44393</link>
      <guid>https://ruby-china.org/topics/44393</guid>
    </item>
    <item>
      <title>Ruby 3.4.0 已发布</title>
      <description>&lt;p&gt;我们很高兴地宣布 Ruby 3.4.0 发布。
Ruby 3.4 增加了块参数引用变量 &lt;code&gt;it&lt;/code&gt;，使用 Prism 作为默认解析器，为 socket 库提供了 Happy Eyeballs Version 2 支持，
改进了 YJIT，添加了模块化垃圾回收功能，及其他改进。&lt;/p&gt;
&lt;h2 id="块中的 it 引用"&gt;块中的 &lt;code&gt;it&lt;/code&gt; 引用&lt;/h2&gt;
&lt;p&gt;当没有定义块参数名时，可以使用 &lt;code&gt;it&lt;/code&gt; 引用块参数。[&lt;a href="https://bugs.ruby-lang.org/issues/18980" rel="nofollow" target="_blank" title=""&gt;Feature #18980&lt;/a&gt;]&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;ary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"foo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"bar"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"baz"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="n"&gt;ary&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upcase&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;#=&amp;gt; ["FOO", "BAR", "BAZ"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;it&lt;/code&gt; 与 &lt;code&gt;_1&lt;/code&gt; 的功能类似。在块中使用 &lt;code&gt;_1&lt;/code&gt; 时，读者可能会以为其他编号参数 (&lt;code&gt;_2&lt;/code&gt; 等) 也会出现，这会给读者带来额外的阅读负担。
因此，我们引入 &lt;code&gt;it&lt;/code&gt; 作为一个便捷的别名。在简单的情况下（例如单行块），使用 &lt;code&gt;it&lt;/code&gt; 可以显著提升可读性。&lt;/p&gt;
&lt;h2 id="Prism 现在是默认解析器"&gt;Prism 现在是默认解析器&lt;/h2&gt;
&lt;p&gt;默认解析器从 parse.y 切换到 Prism。 [&lt;a href="https://bugs.ruby-lang.org/issues/20564" rel="nofollow" target="_blank" title=""&gt;Feature #20564&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;这是一项内部改进，用户应该不会注意到任何变化。如果您发现了任何兼容性问题，请报告给我们。&lt;/p&gt;

&lt;p&gt;如果需要使用原来的解析器，可以使用命令行参数 &lt;code&gt;--parser=parse.y&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id="socket 库现在支持 Happy Eyeballs Version 2 (RFC 8305)"&gt;socket 库现在支持 Happy Eyeballs Version 2 (RFC 8305)&lt;/h2&gt;
&lt;p&gt;socket 库现在支持 &lt;a href="https://datatracker.ietf.org/doc/html/rfc8305" rel="nofollow" target="_blank" title=""&gt;Happy Eyeballs Version 2 (RFC 8305)&lt;/a&gt;，许多编程语言都提供这个最新版本的支持来优化网络连接。
socket 库在 &lt;code&gt;TCPSocket.new&lt;/code&gt; (&lt;code&gt;TCPSocket.open&lt;/code&gt;) 和 &lt;code&gt;Socket.tcp&lt;/code&gt; 中添加了支持。
此项改进使得 Ruby 能够提供更高效可靠的网络连接，更适应现代互联网环境。&lt;/p&gt;

&lt;p&gt;直至 Ruby 3.3，上述的方法会依次执行域名解析和尝试连接。通过现在的算法，将按下面的方式执行：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;并行执行 IPv6 和 IPv4 域名解析&lt;/li&gt;
&lt;li&gt;尝试连接解析到的 IP 地址（IPv6 优先），以 250ms 的间隔进行并行尝试&lt;/li&gt;
&lt;li&gt;返回第一个成功的连接，并取消其他连接&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;这样就保证了最小化网络延迟，即使特定的 IP 协议地址延迟或不可用。
此功能默认启用，不需要额外的配置。如果要全局禁用此功能，可以设置环境变量 &lt;code&gt;RUBY_TCP_NO_FAST_FALLBACK=1&lt;/code&gt;
或者调用 &lt;code&gt;Socket.tcp_fast_fallback=false&lt;/code&gt;。如果要在特定连接中禁用此功能，可以使用关键字参数 &lt;code&gt;fast_fallback: false&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id="YJIT"&gt;YJIT&lt;/h2&gt;&lt;h3 id="摘要"&gt;摘要&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;在 x86-64 和 arm64 平台上的大多数基准测试中，都获得了更好的性能表现。&lt;/li&gt;
&lt;li&gt;减少了编译元数据的内存使用并提供了统一的内存限制。&lt;/li&gt;
&lt;li&gt;修复了多个错误。YJIT 现在更健壮了，并被更好地测试。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="新功能"&gt;新功能&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;命令行参数

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;--yjit-mem-size&lt;/code&gt; （默认值为 128 MiB），用于设置统一的内存限制选项，并跟踪 YJIT 总的内存使用情况，
这比旧的 &lt;code&gt;--yjit-exec-mem-size&lt;/code&gt; 更直观。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--yjit-log&lt;/code&gt; 可以启用编译日志来跟踪被编译的内容。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Ruby API

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;RubyVM::YJIT.log&lt;/code&gt; 可以在运行时获取编译日志的尾部信息。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;YJIT 统计信息

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;RubyVM::YJIT.runtime_stats&lt;/code&gt; 现在总是能在无效化、内联和元数据编码时提供额外的统计信息。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="新优化"&gt;新优化&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;通过压缩上下文减少了存储 YJIT 元数据所需的内存&lt;/li&gt;
&lt;li&gt;为局部变量和方法参数分配寄存器&lt;/li&gt;
&lt;li&gt;当 YJIT 启用时，使用更多 Ruby 编写的核心原型类型:

&lt;ul&gt;
&lt;li&gt;使用 Ruby 重写 &lt;code&gt;Array#each&lt;/code&gt;, &lt;code&gt;Array#select&lt;/code&gt;, &lt;code&gt;Array#map&lt;/code&gt; 以提升性能 [&lt;a href="https://bugs.ruby-lang.org/issues/20182" rel="nofollow" target="_blank" title=""&gt;Feature #20182&lt;/a&gt;]。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;能够内联小型方法，诸如：

&lt;ul&gt;
&lt;li&gt;空方法&lt;/li&gt;
&lt;li&gt;返回常量的方法&lt;/li&gt;
&lt;li&gt;返回 &lt;code&gt;self&lt;/code&gt; 的方法&lt;/li&gt;
&lt;li&gt;直接返回某个参数的方法&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;为更多运行时方法生成专用代码&lt;/li&gt;
&lt;li&gt;优化 &lt;code&gt;String#getbyte&lt;/code&gt;, &lt;code&gt;String#setbyte&lt;/code&gt; 等字符串方法&lt;/li&gt;
&lt;li&gt;优化位运算，加速低级 位/字节 操作&lt;/li&gt;
&lt;li&gt;在 multi-ractor 模式中，支持共享常量&lt;/li&gt;
&lt;li&gt;各种其他增量优化&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="模块化垃圾收集器"&gt;模块化垃圾收集器&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;通过模块化垃圾收集功能，可以动态加载具体的垃圾收集器（GC）实现。
若要启用此功能，可以在构建 Ruby 时，使用 &lt;code&gt;--with-modular-gc&lt;/code&gt; 参数。
运行时可以通过环境变量 &lt;code&gt;RUBY_GC_LIBRARY&lt;/code&gt; 加载 GC 库。
[&lt;a href="https://bugs.ruby-lang.org/issues/20351" rel="nofollow" target="_blank" title=""&gt;Feature #20351&lt;/a&gt;]&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ruby 内置的垃圾收集器已被拆分到单独的文件 &lt;code&gt;gc/default/default.c&lt;/code&gt; 并通过 &lt;code&gt;gc/gc_impl.h&lt;/code&gt; 中定义的 API 与 Ruby 进行交互。
现在，内置的垃圾收集器也可以作为库进行构建：通过 &lt;code&gt;make modular-gc MODULAR_GC=default&lt;/code&gt; 进行构建，
并通过环境变量 &lt;code&gt;RUBY_GC_LIBRARY=default&lt;/code&gt; 启用。 [&lt;a href="https://bugs.ruby-lang.org/issues/20470" rel="nofollow" target="_blank" title=""&gt;Feature #20470&lt;/a&gt;]&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;提供了一个基于 &lt;a href="https://www.mmtk.io/" rel="nofollow" target="_blank" title=""&gt;MMTk&lt;/a&gt; 的实验性 GC 库。此库可以通过 &lt;code&gt;make modular-gc MODULAR_GC=mmtk&lt;/code&gt; 进行构建，
并通过环境变量 &lt;code&gt;RUBY_GC_LIBRARY=mmtk&lt;/code&gt; 启用。构建的计算机需要 Rust 工具链。 [&lt;a href="https://bugs.ruby-lang.org/issues/20860" rel="nofollow" target="_blank" title=""&gt;Feature #20860&lt;/a&gt;]&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="语言变化"&gt;语言变化&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;在没有 &lt;code&gt;frozen_string_literal&lt;/code&gt; 注释的文件中，当字符串字面量被修改时会发出警告。
这些警告可以使用 &lt;code&gt;-W:deprecated&lt;/code&gt; 或者通过设置 &lt;code&gt;Warning[:deprecated] = true&lt;/code&gt; 来启用。
如要禁用此变化，您可以在运行 Ruby 时，使用 &lt;code&gt;--disable-frozen-string-literal&lt;/code&gt; 命令行参数。 [&lt;a href="https://bugs.ruby-lang.org/issues/20205" rel="nofollow" target="_blank" title=""&gt;Feature #20205&lt;/a&gt;]&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;支持在调用方法时使用 &lt;code&gt;nil&lt;/code&gt; 作为关键字展开参数。
&lt;code&gt;**nil&lt;/code&gt; 类似于 &lt;code&gt;**{}&lt;/code&gt;，不传递关键字参数，也不调用任何转换方法。 [&lt;a href="https://bugs.ruby-lang.org/issues/20064" rel="nofollow" target="_blank" title=""&gt;Bug #20064&lt;/a&gt;]&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;索引不再接受块传递。 [&lt;a href="https://bugs.ruby-lang.org/issues/19918" rel="nofollow" target="_blank" title=""&gt;Bug #19918&lt;/a&gt;]&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;索引不再接受关键字参数。 [&lt;a href="https://bugs.ruby-lang.org/issues/20218" rel="nofollow" target="_blank" title=""&gt;Bug #20218&lt;/a&gt;]&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;顶级名 &lt;code&gt;::Ruby&lt;/code&gt; 现在是保留的，当启用 &lt;code&gt;Warning[:deprecated]&lt;/code&gt; 时，如果对其进行定义将会被警告。 [&lt;a href="https://bugs.ruby-lang.org/issues/20884" rel="nofollow" target="_blank" title=""&gt;Feature #20884&lt;/a&gt;]&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="核心类更新"&gt;核心类更新&lt;/h2&gt;
&lt;p&gt;注意：我们仅列出了核心类中值得注意的更新。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Exception&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Exception#set_backtrace&lt;/code&gt; 现在接受 &lt;code&gt;Thread::Backtrace::Location&lt;/code&gt; 数组。
&lt;code&gt;Kernel#raise&lt;/code&gt;，&lt;code&gt;Thread#raise&lt;/code&gt; 和 &lt;code&gt;Fiber#raise&lt;/code&gt; 也接受这个新格式。 [&lt;a href="https://bugs.ruby-lang.org/issues/13557" rel="nofollow" target="_blank" title=""&gt;Feature #13557&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GC&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;新增 &lt;code&gt;GC.config&lt;/code&gt;，可以为垃圾收集器设置配置变量。 [&lt;a href="https://bugs.ruby-lang.org/issues/20443" rel="nofollow" target="_blank" title=""&gt;Feature #20443&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;新增 GC 配置参数 &lt;code&gt;rgengc_allow_full_mark&lt;/code&gt; 。如果值为 &lt;code&gt;false&lt;/code&gt;，GC 仅标记年轻对象。默认值为 &lt;code&gt;true&lt;/code&gt;。  [&lt;a href="https://bugs.ruby-lang.org/issues/20443" rel="nofollow" target="_blank" title=""&gt;Feature #20443&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ractor&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;允许在 Ractor 中使用 &lt;code&gt;require&lt;/code&gt;。引入过程将在主 Ractor 中执行。
可以通过 &lt;code&gt;Ractor._require(feature)&lt;/code&gt; 在主 Ractor 中执行引入过程。 [&lt;a href="https://bugs.ruby-lang.org/issues/20627" rel="nofollow" target="_blank" title=""&gt;Feature #20627&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;新增 &lt;code&gt;Ractor.main?&lt;/code&gt;。 [&lt;a href="https://bugs.ruby-lang.org/issues/20627" rel="nofollow" target="_blank" title=""&gt;Feature #20627&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;新增 &lt;code&gt;Ractor.[]&lt;/code&gt; 和 &lt;code&gt;Ractor.[]=&lt;/code&gt; 来访问当前 Ractor 关联存储的内容。 [&lt;a href="https://bugs.ruby-lang.org/issues/20715" rel="nofollow" target="_blank" title=""&gt;Feature #20715&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;新增 &lt;code&gt;Ractor.store_if_absent(key){ init }&lt;/code&gt;，可以在进程安全的环境下初始化 ractor 关联的本地变量。 [&lt;a href="https://bugs.ruby-lang.org/issues/20875" rel="nofollow" target="_blank" title=""&gt;Feature #20875&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Range&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;当 range 不可枚举时，&lt;code&gt;Range#size&lt;/code&gt; 将抛出 &lt;code&gt;TypeError&lt;/code&gt;。 [&lt;a href="https://bugs.ruby-lang.org/issues/18984" rel="nofollow" target="_blank" title=""&gt;Misc #18984&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="标准库更新"&gt;标准库更新&lt;/h2&gt;
&lt;p&gt;注意：我们仅列出了标准库中值得注意的更新。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;RubyGems&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;gem push 增加 &lt;code&gt;--attestation&lt;/code&gt; 参数。此参数允许保存签名到 &lt;a href="https://www.sigstore.dev/" rel="nofollow" target="_blank" title=""&gt;sigstore.dev&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bundler&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;新增 &lt;code&gt;lockfile_checksums&lt;/code&gt; 参数，将校验和包含到新的 lockfiles 中&lt;/li&gt;
&lt;li&gt;新增 &lt;code&gt;--add-checksums&lt;/code&gt; 向既有 lockfile 中增加校验和&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;JSON&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;性能改进，&lt;code&gt;JSON.parse&lt;/code&gt; 现在比 json-2.7.x 快约 1.5 倍。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tempfile&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Tempfile.create&lt;/code&gt; 新增关键字参数 &lt;code&gt;anonymous: true&lt;/code&gt;。
&lt;code&gt;Tempfile.create(anonymous: true)&lt;/code&gt; 会立即移除创建的临时文件。应用程序无需显式地移除临时文件。
[&lt;a href="https://bugs.ruby-lang.org/issues/20497" rel="nofollow" target="_blank" title=""&gt;Feature #20497&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;win32/sspi.rb&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;此库现在从 Ruby 代码仓库抽取到独立的代码仓库 &lt;a href="https://github.com/ruby/net-http-sspi" rel="nofollow" target="_blank" title=""&gt;ruby/net-http-sspi&lt;/a&gt;。[&lt;a href="https://bugs.ruby-lang.org/issues/20775" rel="nofollow" target="_blank" title=""&gt;Feature #20775&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="兼容性问题"&gt;兼容性问题&lt;/h2&gt;
&lt;p&gt;注意：不包括问题补丁。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;修改了错误信息和错误栈的显示。

&lt;ul&gt;
&lt;li&gt;使用单引号 (&lt;code&gt;'&lt;/code&gt;) 代替反勾号 (&lt;code&gt;`&lt;/code&gt;) 作为错误消息的起始引号。 [&lt;a href="https://bugs.ruby-lang.org/issues/16495" rel="nofollow" target="_blank" title=""&gt;Feature #16495&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;在方法名前显示类名（仅当类具有永久名称时）。 [&lt;a href="https://bugs.ruby-lang.org/issues/19117" rel="nofollow" target="_blank" title=""&gt;Feature #19117&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Kernel#caller&lt;/code&gt;，&lt;code&gt;Thread::Backtrace::Location&lt;/code&gt; 等处也进行了相应更改。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;此前:
test.rb:1:in `foo': undefined method `time' for an instance of Integer
        from test.rb:2:in `&amp;lt;main&amp;gt;'

现在:
test.rb:1:in 'Object#foo': undefined method 'time' for an instance of Integer
        from test.rb:2:in `&amp;lt;main&amp;gt;'
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Hash#inspect 的展示形式发生变化。 [&lt;a href="https://bugs.ruby-lang.org/issues/20433" rel="nofollow" target="_blank" title=""&gt;Bug #20433&lt;/a&gt;]&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;键是 Symbol 时，使用现代的语法形式： &lt;code&gt;"{user: 1}"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;其他类型的键值对在显示时，在 &lt;code&gt;=&amp;gt;&lt;/code&gt; 前后加入空格：&lt;code&gt;'{"user" =&amp;gt; 1}'&lt;/code&gt;，此前显示时没有空格： &lt;code&gt;'{"user"=&amp;gt;1}'&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Kernel#Float() 现在接受省略小数部分的数字字符串。 [&lt;a href="https://bugs.ruby-lang.org/issues/20705" rel="nofollow" target="_blank" title=""&gt;Feature #20705&lt;/a&gt;]&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"1."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;    &lt;span class="c1"&gt;#=&amp;gt; 1.0 (此前会导致 ArgumentError)&lt;/span&gt;
&lt;span class="no"&gt;Float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"1.E-1"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;#=&amp;gt; 0.1 (此前会导致 ArgumentError)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;String#to_f 现在接受省略小数部分的数字字符串。注意，当指定指数时，返回结果与此前不同。 [&lt;a href="https://bugs.ruby-lang.org/issues/20705" rel="nofollow" target="_blank" title=""&gt;Feature #20705&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="s2"&gt;"1."&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_f&lt;/span&gt;    &lt;span class="c1"&gt;#=&amp;gt; 1.0&lt;/span&gt;
&lt;span class="s2"&gt;"1.E-1"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_f&lt;/span&gt; &lt;span class="c1"&gt;#=&amp;gt; 0.1 (此前会返回 1.0)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;移除 &lt;code&gt;Refinement#refined_class&lt;/code&gt;。 [&lt;a href="https://bugs.ruby-lang.org/issues/19714" rel="nofollow" target="_blank" title=""&gt;Feature #19714&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="标准库兼容性问题"&gt;标准库兼容性问题&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;DidYouMean&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;移除 &lt;code&gt;DidYouMean::SPELL_CHECKERS[]=&lt;/code&gt; 和 &lt;code&gt;DidYouMean::SPELL_CHECKERS.merge!&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Net::HTTP&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;移除下列已废弃常量：

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Net::HTTP::ProxyMod&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Net::NetPrivate::HTTPRequest&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Net::HTTPInformationCode&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Net::HTTPSuccessCode&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Net::HTTPRedirectionCode&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Net::HTTPRetriableCode&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Net::HTTPClientErrorCode&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Net::HTTPFatalErrorCode&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Net::HTTPServerErrorCode&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Net::HTTPResponseReceiver&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Net::HTTPResponceReceiver&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这些变量从 2012 年起已废弃。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Timeout&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Timeout.timeout&lt;/code&gt; 的参数不允许负值。 [&lt;a href="https://bugs.ruby-lang.org/issues/20795" rel="nofollow" target="_blank" title=""&gt;Bug #20795&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;URI&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;默认解析器从 RFC 2396 兼容切换到 RFC 3986 兼容。 [&lt;a href="https://bugs.ruby-lang.org/issues/19266" rel="nofollow" target="_blank" title=""&gt;Bug #19266&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="C API 更新"&gt;C API 更新&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;移除 &lt;code&gt;rb_newobj&lt;/code&gt; 和 &lt;code&gt;rb_newobj_of&lt;/code&gt; （以及相关的宏 &lt;code&gt;RB_NEWOBJ&lt;/code&gt;，&lt;code&gt;RB_NEWOBJ_OF&lt;/code&gt;，&lt;code&gt;NEWOBJ&lt;/code&gt;，&lt;code&gt;NEWOBJ_OF&lt;/code&gt;）。 [&lt;a href="https://bugs.ruby-lang.org/issues/20265" rel="nofollow" target="_blank" title=""&gt;Feature #20265&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;移除已废弃的函数 &lt;code&gt;rb_gc_force_recycle&lt;/code&gt;。 [&lt;a href="https://bugs.ruby-lang.org/issues/18290" rel="nofollow" target="_blank" title=""&gt;Feature #18290&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="其他变化"&gt;其他变化&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;如果传递了一个块给不使用块的方法时，在详细模式（&lt;code&gt;-w&lt;/code&gt;）中将显示警告。 [&lt;a href="https://bugs.ruby-lang.org/issues/15554" rel="nofollow" target="_blank" title=""&gt;Feature #15554&lt;/a&gt;]&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ruby 对一些核心方法通过解释器和 JIT 进行了优化，诸如 &lt;code&gt;String.freeze&lt;/code&gt;，&lt;code&gt;Integer#+&lt;/code&gt;。
当这些方法被重定义时，解释器将发出性能警告（&lt;code&gt;-W:performance&lt;/code&gt; 或 &lt;code&gt;Warning[:performance] = true&lt;/code&gt;）。 [&lt;a href="https://bugs.ruby-lang.org/issues/20429" rel="nofollow" target="_blank" title=""&gt;Feature #20429&lt;/a&gt;]&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;更多详情，可参见 &lt;a href="https://docs.ruby-lang.org/en/3.4/NEWS_md.html" rel="nofollow" target="_blank" title=""&gt;NEWS&lt;/a&gt;
或 &lt;a href="https://github.com/ruby/ruby/compare/v3_3_0...{{%20release.tag%20}}" title=""&gt;提交日志&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;圣诞快乐，节日快乐，享受 Ruby 3.4 的编程乐趣！&lt;/p&gt;
&lt;h2 id="Ruby 是什么"&gt;Ruby 是什么&lt;/h2&gt;
&lt;p&gt;Ruby 最初由 Matz（松本行弘，Yukihiro Matsumoto）于 1993 年开发，
现在以开源软件的形式开发。它可以在多个平台上运行，并在全球得到广泛使用，尤其是 Web 开发领域。&lt;/p&gt;</description>
      <author>Gao-Jun</author>
      <pubDate>Fri, 27 Dec 2024 15:46:14 +0800</pubDate>
      <link>https://ruby-china.org/topics/43990</link>
      <guid>https://ruby-china.org/topics/43990</guid>
    </item>
    <item>
      <title>反馈坏链：“友情社区”里的 https://gocn.vip/ 似乎无法访问了</title>
      <description>&lt;p&gt;如题&lt;/p&gt;</description>
      <author>Gao-Jun</author>
      <pubDate>Tue, 01 Oct 2024 22:03:25 +0800</pubDate>
      <link>https://ruby-china.org/topics/43900</link>
      <guid>https://ruby-china.org/topics/43900</guid>
    </item>
    <item>
      <title>请教一个 Ruby 语法问题</title>
      <description>&lt;p&gt;这几天看书的时候看到如下代码：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;times&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输出为&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2
3
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中 if 的判断条件 &lt;code&gt;(n==2)..(n==3)&lt;/code&gt; 单独放到 irb 里解析，会得到 &lt;code&gt;bad value for range&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;那这个 if 判断中的条件应当如何理解呢？&lt;/p&gt;</description>
      <author>Gao-Jun</author>
      <pubDate>Wed, 11 Oct 2023 14:16:46 +0800</pubDate>
      <link>https://ruby-china.org/topics/43381</link>
      <guid>https://ruby-china.org/topics/43381</guid>
    </item>
  </channel>
</rss>
