Ruby 4.0.0 preview3 发布
由 naruse 发布于 2025 年 12 月 18 日
我们很高兴地宣布 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)会像流式点(fluent dot)一样延续上一行。以下两个代码是等价的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不再包含数字参数。此外,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 元素格式[path, line]仍然可以通过调用结果的.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现在执行大小检查,以防止出现无限范围的问题。[Bug #21654] -
Range#overlap?现在能正确处理无限(无界)范围。[Bug #21185] -
修复了
Range#max在开始端未定义的整数范围上的行为。[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现在是一个核心类,而不是一个自动加载的 stdlib 类。[Feature #21216] -
Set#inspect现在返回一个适合eval的字符串,使用Set[]语法(例如,Set[1, 2, 3]而不是#<Set: {1, 2, 3}>)。这使其与其他核心集合类(如 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
- 引入了对
Thread#raise(cause:)参数的支持,类似于Kernel#raise。[Feature #21360]
- 引入了对
-
Fiber
- 引入了对
Fiber#raise(cause:)参数的支持,类似于Kernel#raise。[Feature #21360]
- 引入了对
-
Fiber::Scheduler
- 引入了
Fiber::Scheduler#fiber_interrupt来用给定的异常中断一个 fiber。最初的用例是当中断一个正在等待阻塞 I/O 操作的 fiber 时,该 I/O 操作被关闭。[Feature #21166]
- 引入了
-
Pathname
- Pathname 已从默认 gem 提升为 Ruby 的核心类。[Feature #17473]
Stdlib 更新
以下捆绑 gem 已从默认 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
我们只列出重要的功能性 stdlib 更改。
其他更改列在以下部分。如果之前的捆绑版本 Ruby 3.3.0 有 GitHub 发布,我们也列出了从那时起的发布历史。
添加了以下默认 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
更新了以下捆绑 gem。
- 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
- 已停止支持 MSVC 版本低于 14.0 (_MSC_VER 1900)。这意味着现在需要 Visual Studio 2015 或更高版本。
兼容性问题
-
由于添加了
Ractor::Port,以下方法已从 Ractor 中移除:Ractor.yieldRactor#takeRactor#close_incomingRactor#close_outgoing
-
ObjectSpace._id2ref已被弃用。[Feature #15408] -
已移除
Process::Status#&和Process::Status#>>。它们在 Ruby 3.3 中已被弃用。[Bug #19868] -
已移除
rb_path_check。此函数曾用于$SAFE路径检查,该检查在 Ruby 2.7 中已被移除,并且已被弃用。[Feature #20971]
标准库兼容性问题
-
CGI 库已从默认 gem 中移除。现在我们只提供
cgi/escape以支持以下方法:CGI.escape和CGI.unescapeCGI.escapeHTML和CGI.unescapeHTMLCGI.escapeURIComponent和CGI.unescapeURIComponentCGI.escapeElement和CGI.unescapeElement
-
随着
Set从 stdlib 迁移到核心类,set/sorted_set.rb已被移除,SortedSet不再是自动加载的常量。请安装sorted_setgem 并require 'sorted_set'来使用SortedSet。[Feature #21287]
C API 更新
-
IO
rb_thread_fd_close已被弃用,现在是一个 no-op。如果您需要将文件描述符从 C 扩展公开给 Ruby 代码,请使用RUBY_IO_MODE_EXTERNAL创建一个IO实例,并使用rb_io_close(io)来关闭它(这也会中断并等待IO实例上所有待处理的操作)。直接关闭文件描述符不会中断待处理的操作,并可能导致未定义的行为。换句话说,如果两个IO对象共享同一个文件描述符,关闭其中一个不会影响另一个。[Feature #18455]
-
GVL
rb_thread_call_with_gvl现在无论是否有 GVL 都能工作。这允许 gem 避免检查ruby_thread_has_gvl_p。请仍然谨慎对待 GVL。[Feature #20750]
-
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 和 Threads 时可能出现的死锁。
- 修复了 Ractor 中 require 和 autoload 的问题。
- 修复了跨 Ractor 的编码/转码问题。
- 修复了 GC 操作和方法无效化中的竞态条件。
- 修复了启动 Ractor 后进行进程 fork 的问题。
JIT
- ZJIT
- 引入了一个实验性的基于方法的 JIT 编译器。要启用
--zjit支持,请使用 Rust 1.85.0 或更高版本构建 Ruby。 - 截至 Ruby 4.0.0,ZJIT 比解释器快,但不如 YJIT 快。我们鼓励尝试 ZJIT,但目前不建议将其部署到生产环境。
- 我们的目标是使 ZJIT 在 Ruby 4.1 中比 YJIT 更快并可用于生产环境。
- 引入了一个实验性的基于方法的 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 仓库](https://github.com/ruby/rjit)。
其他更改
有关更多详细信息,请参阅 NEWS 或 commit logs。
自 Ruby 3.4.0 以来,3776 个文件已更改,222800 行插入(+),293617 行删除(-)!
下载
-
https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0-preview3.tar.gz
SIZE: 23865890 SHA1: a348f196e0314d8863ae5d5f0a588a37c52aa89c SHA256: 43d0926e776fbd5599adcc7bccb4ccc804e109f402a2068607a2a86562c2cdc0 SHA512: 1c7f10405832646eceacb278ea7cc3445dc0e1778e9a9331062f2fb0164d45ba5af0b4244dc6ae46e36730d6cafb4c4196fbd4f4fb74029afde5ecf4fd433a6b -
https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0-preview3.tar.xz
SIZE: 17915004 SHA1: b7b99831558b9cd6cf8fb148f07cd4e8e59d9e99 SHA256: 8d7a503b2c4abcfacf0fa54ac56d37f7dd6d643a3a717661729cabbe947610a6 SHA512: b046c015a58daafb1640d8db62a36ebf64c7f83fbfb033fa327458afab6e9c31b1c2b194b347fd63f16e413e732d3e6ac20076282b433ef16923343c9ed84aa1 -
https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0-preview3.zip
SIZE: 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 采用了 Aliki——RDoc 的新默认主题,焕然一新。
由 Stan Lo 发布于 2025 年 12 月 23 日
重新设计我们的网站标识
我们很高兴地宣布对我们的网站进行全面重新设计。此次更新的设计由 Akatsuka Taeko 创作。
由 Hiroshi SHIBATA 发布于 2025 年 12 月 22 日
Ruby 3.4.8 发布
Ruby 3.4.8 已发布。
由 k0kubun 发布于 2025 年 12 月 17 日