Ruby 4.0.0 preview3 已发布
由 naruse 发表于 2025-12-18
翻译: GAO Jun
我们很高兴地宣布 Ruby 4.0.0-preview3 已发布。 Ruby 4.0 引入了 Ruby::Box 和 “ZJIT”,以及若干改进。
Ruby::Box
这是一项新的用于提供定义隔离的实验性功能。 “Ruby Box” 的详细信息,可以参阅 doc/language/box.md。 [Feature #21311] [Misc #21385]
语言变化
-
*nil不再调用nil.to_a,就像**nil不再调用nil.to_hash。 [Feature #21047] -
行首的逻辑二元运算符 (
||,&&,and和or) 与行首的.一样,延续上一行。下面两段代码是等价的:if condition1 && condition2 ... endif condition1 && condition2 ... end
核心类更新
注意:我们只列出了重要的核心类更新。
-
Kernel
-
Kernel#inspect现在会检查是否存在#instance_variables_to_inspect方法, 这个方法可以用来控制在#inspect的结果字符串中包含哪些实例变量:class DatabaseConfig def initialize(host, user, password) @host = host @user = user @password = password end private def instance_variables_to_inspect = [:@host, :@user] end conf = DatabaseConfig.new("localhost", "root", "hunter2") conf.inspect #=> #<DatabaseConfig:0x0000000104def350 @host="localhost", @user="root"> -
声明废弃行为:
Kernel#open以传入|起始的字符串来创建进程的功能被移除。 [Feature #19630]
-
-
Binding
Binding#local_variables不再包含数字引用参数(如_1,_2)。 同样,Binding#local_variable_get和Binding#local_variable_set也会拒绝处理数字引用参数。 [Bug #21049]
-
File
- Linux 中,
File::Stat#birthtime在操作系统和文件系统支持的情况下,会通过statx系统调用实现。 [Feature #21205]
- Linux 中,
-
IO
-
IO.select允许使用Float::INFINITY作为超时参数。 [Feature #20610] -
声明废弃行为:
IO类以传入|起始的字符串来创建进程的功能被移除。 [Feature #19630]
-
-
Math
- 新增
Math.log1p和Math.expm1。 [Feature #21527]
- 新增
-
Method
Method#source_location,Proc#source_location和UnboundMethod#source_location现在返回 5 个位置信息:[path, start_line, start_column, end_line, end_column]。 其中前 2 个信息仍然可以通过在结果上调用.take(2)来获取。 [Feature #6012]
-
Proc
Proc#parameters现在将匿名可选参数显示为[:opt],替代原来的[:opt, nil], 使得输出能与需要匿名参数时一致。 [Bug #20974]
-
Ractor
-
新增
Ractor::Port类,用于在 Ractor 之间进行通信的新同步机制。 [Feature #21262]port1 = Ractor::Port.new port2 = Ractor::Port.new Ractor.new port1, port2 do |port1, port2| port1 << 1 port2 << 11 port1 << 2 port2 << 12 end 2.times{ p port1.receive } #=> 1, 2 2.times{ p port2.receive } #=> 11, 12Ractor::Port提供以下方法:Ractor::Port#receiveRactor::Port#send(或Ractor::Port#<<)Ractor::Port#closeRactor::Port#closed?
由此,
Ractor.yield和Ractor#take被移除。 -
新增
Ractor#join和Ractor#value,用于等待 Ractor 终止。 这类似于Thread#join和Thread#value。 -
新增
Ractor#monitor和Ractor#unmonitor作为内部使用的底层接口来实现Ractor#join。 -
Ractor.select现在只接受 Ractors 和 Ports 作为参数。 如果参数是 Ractors,方法会在某个 Ractor 终止时返回。 -
新增
Ractor#default_port。每个Ractor都有一个默认端口,用于Ractor.send,Ractor.receive。 -
移除
Ractor#close_incoming和Ractor#close_outgoing。 -
引入
Ractor.shareable_proc和Ractor.shareable_lambda实现可共享的 Proc 或 lambda。 [Feature #21550], [Feature #21557]
-
-
Range
-
Range#to_set和Enumerator#to_set现在会先检查大小,来避免无上限 range 的问题。 [Bug #21654] -
Range#overlap?现在可以正确处理无限(无界) range。 [Bug #21185] -
Range#max在无下限整数 range 中的行为已修复。 [Bug #21174] [Bug #21175]
-
-
Ruby
- 定义了新的顶级模块
Ruby,包含了 Ruby 相关的常量,此模块在 Ruby 3.4 中被保留, 现在被正式定义。 [Feature #20884]
- 定义了新的顶级模块
-
Ruby::Box
- 这是一项新的(实验性)功能,用于实现定义分离。 关于 “Ruby Box” 的详细信息,请参阅 doc/language/box.md。 [Feature #21311] [Misc #21385]
-
Set
-
Set现在是一个核心类,不再是自动加载的标准库类。 [Feature #21216] -
Set#inspect现在返回一个更适合eval的字符串, 使用Set[]语法(如:Set[1, 2, 3],代替原来的#<Set: {1, 2, 3}>)。 这使得Set的行为能与其他核心集合类(如:Array和Hash)保持一致。 [Feature #21389] -
声明废弃向方法
Set#to_set和Enumerable#to_set传递参数的行为。 [Feature #21390]
-
-
Socket
Socket.tcp和TCPSocket.new现在能接受关键词参数open_timeout来定义初始连接时的超时时间。 [Feature #21347]
-
String
-
更新 Unicode 版本至 17.0.0,更新 Emoji 版本至 17.0。 [Feature #19908][Feature #20724][Feature #21275] (同样适用于 Regexp)
-
扩展
String#strip,strip!,lstrip,lstrip!,rstrip和rstrip!以接受*selectors参数。 [Feature #21552]
-
-
Thread
- 引入和
Kernel#raise类似的参数支持Thread#raise(cause:)。 [Feature #21360]
- 引入和
-
Fiber
- 引入和
Kernel#raise类似的参数支持Fiber#raise(cause:)。 [Feature #21360]
- 引入和
-
Fiber::Scheduler
- 引入
Fiber::Scheduler#fiber_interrupt,允许通过指定异常来终端纤程。 典型的用例是当 IO 操作关闭时,中断等待此 IO 的纤程。 [Feature #21166]
- 引入
-
Pathname
- Pathname 从默认 gem 提升为 Ruby 核心类。 [Feature #17473]
标准库更新
以下默认 gems 提升为绑定 gem。
- ostruct 0.6.3
- pstore 0.2.0
- benchmark 0.5.0
- logger 1.7.0
- rdoc 6.17.0
- win32ole 1.9.2
- irb 1.16.0
- reline 0.6.3
- readline 0.0.4
- fiddle 1.1.8
我们只列出了重要的标准库更新。
新增以下默认 gem。
- win32-registry 0.1.2
更新以下默认 gem。
- RubyGems 4.0.2
- bundler 4.0.2
- date 3.5.1
- digest 3.2.1
- english 0.8.1
- erb 6.0.1
- etc 1.4.6
- fcntl 1.3.0
- fileutils 1.8.0
- forwardable 1.4.0
- io-console 0.8.2
- io-nonblock 0.3.2
- io-wait 0.4.0
- ipaddr 1.2.8
- json 2.18.0
- net-http 0.9.1
- openssl 4.0.0
- optparse 0.8.1
- pp 0.6.3
- prism 1.6.0
- psych 5.3.1
- resolv 0.7.0
- stringio 3.2.0
- strscan 3.1.6
- time 0.4.2
- timeout 0.6.0
- uri 1.1.1
- weakref 0.1.4
- zlib 3.2.2
更新以下绑定 gems。
- minitest 5.27.0
- power_assert 3.0.1
- rake 13.3.1
- test-unit 3.7.3
- rexml 3.4.4
- net-ftp 0.3.9
- net-imap 0.6.1
- net-smtp 0.5.1
- matrix 0.4.3
- prime 0.1.4
- rbs 3.10.0.pre.2
- typeprof 0.31.0
- debug 1.11.0
- base64 0.3.0
- bigdecimal 4.0.1
- drb 2.2.3
- syslog 0.3.0
- csv 3.3.5
- repl_type_completor 0.1.12
支持平台
-
Windows
- 不再支持 14.0(_MSC_VER 1900)之前的 MSVC 版本。 这意味着现在需要 Visual Studio 2015 或更新版本。
兼容性问题
-
由于新增了
Ractor::Port,以下方法从 Ractor 中被移除:Ractor.yieldRactor#takeRactor#close_incomingRactor#close_outgoging
-
声明废弃
ObjectSpace._id2ref。 [Feature #15408] -
移除
Process::Status#&和Process::Status#>>,他们已在 Ruby 3.3 中声明废弃。 [Bug #19868] -
移除
rb_path_check。此方法原用来检查已在 Ruby 2.7 中移除的$SAFE路径。 [Feature #20971]
标准库兼容性问题
-
CGI 库从默认 gems 中移除。现在
cgi/escape仅提供下列方法:CGI.escape和CGI.unescapeCGI.escapeHTML和CGI.unescapeHTMLCGI.escapeURIComponent和CGI.unescapeURIComponentCGI.escapeElement和CGI.unescapeElement
-
随着
Set类从标准库升为核型类,set/sorted_set.rb被移除。SortedSet不再是自动加载的常量。 如需使用SortedSet,请先安装sorted_setgem,然后执行require 'sorted_set'。 [Feature #21287]
C API 更新
-
IO
rb_thread_fd_close已声明废弃,如果执行将不产生任何效果。 如果您需要将 C 扩展的文件描述符暴露给 Ruby 代码,可以创建一个使用RUBY_IO_MODE_EXTERNAL的IO实例,然后使用rb_io_close(io)进行关闭(此操作也会中断并等待该IO上所有的待处理操作)。 直接关闭文件描述符不会中断待处理操作,可能会导致未定义的行为。换言之,如果两个IO对象共享相同的文件描述符, 则关闭一个不会影响另一个。 [Feature #18455]
-
GVL
- 现在,无论是否使用 GVL,
rb_thread_call_with_gvl都可以正常工作。 这使得 gems 可以避免检查ruby_thread_has_gvl_p。 但仍请谨慎对待 GVL。 [Feature #20750]
- 现在,无论是否使用 GVL,
-
Set
-
新增一组用于
Set的 C API。 支持以下方法: [Feature #21459]rb_set_foreachrb_set_newrb_set_new_caparb_set_lookuprb_set_addrb_set_clearrb_set_deleterb_set_size
-
实现改进
Ractor
为了让 Ractors 更加稳定、高效、易用,我们投入了大量的工作。 这些改进让 Ractors 的实现逐渐完整,并即将离开实验性状态。
- 性能提升
- 冻结字符串和符号表在内部使用了无锁哈希集合
- 方法缓存查找在多数场景下可以避免锁定
- 类(以及 geniv)实例变量访问速度更快,并且可以避免锁定
- 在对象分配过程中,避免了缓存争用
- 在多数场景下
object_id能避免锁定
- 错误修复和稳定性提升
- 修正了同时使用 Ractors 和进程时的可能死锁情况
- 修正了 Ractor 中 require 和自动载入的问题
- 修正了 Ractors 间的 编码/转码 问题
- 修复了 GC 操作和方法失效中的竞争条件
- 修正了在启动 Ractor 后进行进程分叉的问题
JIT
- ZJIT
- 引入了 实验性的基于方法的 JIT 编译器.
如需启用
--zjit支持,需要使用 Rust 1.85.0 或后续版本来构建 Ruby。 - 从 Ruby 4.0.0 起,ZJIT 比解释器更快,但还不及 YJIT。 我们鼓励尝试 ZJIT,但目前不建议将其用于生产环境。
- 我们的目标是让 ZJIT 比 YJIT 更快,并在 Ruby 4.1 时可用于生产环境。
- 引入了 实验性的基于方法的 JIT 编译器.
如需启用
- YJIT
RubyVM::YJIT.runtime_statsratio_in_yjit在标准构建中不可用。 可以在configure中设置--enable-yjit=stats并在调用时通过--yjit-stats来启用。- 在默认统计中新增
invalidate_everything,当 TracePoint 失效代码时,此统计信息会递增。
RubyVM::YJIT.enable新增选项mem_size:和call_threshold:。
- RJIT
- 移除
--rjit。我们将把第三方 JIT API 实现迁移到 ruby/rjit 代码库。
- 移除
其他变化
自 Ruby 3.4.0 以来,这些变化共导致 3776 个文件被更改,新增 222800 行(+),删除 293617 行(-)!
下载
-
https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0-preview3.tar.gz
文件大小: 23865890 SHA1: a348f196e0314d8863ae5d5f0a588a37c52aa89c SHA256: 43d0926e776fbd5599adcc7bccb4ccc804e109f402a2068607a2a86562c2cdc0 SHA512: 1c7f10405832646eceacb278ea7cc3445dc0e1778e9a9331062f2fb0164d45ba5af0b4244dc6ae46e36730d6cafb4c4196fbd4f4fb74029afde5ecf4fd433a6b -
https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0-preview3.tar.xz
文件大小: 17915004 SHA1: b7b99831558b9cd6cf8fb148f07cd4e8e59d9e99 SHA256: 8d7a503b2c4abcfacf0fa54ac56d37f7dd6d643a3a717661729cabbe947610a6 SHA512: b046c015a58daafb1640d8db62a36ebf64c7f83fbfb033fa327458afab6e9c31b1c2b194b347fd63f16e413e732d3e6ac20076282b433ef16923343c9ed84aa1 -
https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0-preview3.zip
文件大小: 29403010 SHA1: 689cb6c497afb96d26745708e772b63afca52e1a SHA256: c29147727a8eacf01b942012e3d6fa26010f98f43f6ab249c391f47c744f44cf SHA512: c07d6069b391e38ec99725201d021998ccfb913423636f729eccd0cff17cb9ab7e8565f46d68eea96cf7f546cee647892ca3f37b720a202e8e5496cd10dd168b
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 采用了全新的、RDoc 的 Aliki 默认主题。
由 Stan Lo 发表于 2025-12-23
重新设计我们的网站标识
我们激动地宣布网站已经全面改版。此次更新的设计方案由 Taeko Akatsuka (赤塚妙子) 创作。
由 Hiroshi SHIBATA 发表于 2025-12-22
Ruby 3.4.8 已发布
Ruby 3.4.8 已发布。
由 k0kubun 发表于 2025-12-17