Ruby 3.4.0 的 新闻¶ ↑
本文档列出了自 3.3.0 版本以来,除了错误修复之外的用户可见的功能变更。
请注意,每个条目都保持在最低限度,详情请参阅链接。
语言变更¶ ↑
-
添加了
it
来引用块参数。 [特性 #18980] -
当没有
frozen_string_literal
注释的文件中的String
字面量被修改时,现在会发出弃用警告。可以使用-W:deprecated
或设置Warning[:deprecated] = true
来启用这些警告。要禁用此更改,可以使用--disable-frozen-string-literal
命令行参数运行 Ruby。 [特性 #20205]-
String#+@
现在在修改字符串会发出弃用警告时会进行复制,作为str.dup if str.frozen?
模式的替代方案。
-
-
现在支持在调用方法时进行关键字展开
nil
。**nil
的处理方式与**{}
类似,不传递任何关键字,也不调用任何转换方法。 [Bug #20064] -
索引赋值中不再允许传递块(例如,
a[0, &b] = 1
)。 [Bug #19918] -
索引赋值中不再允许使用关键字参数(例如,
a[0, kw: 1] = 2
)。 [Bug #20218] -
顶层名称
::Ruby
现在被保留,并且当Warning[:deprecated]
时,定义将发出警告。 [特性 #20884]
核心类更新¶ ↑
注意:我们只列出突出的类更新。
-
-
添加了
Array#fetch_values
。 [特性 #20702]
-
-
-
Exception#set_backtrace
现在接受Thread::Backtrace::Location
数组。Kernel#raise
、Thread#raise
和Fiber#raise
也接受这种新格式。 [特性 #13557]
-
-
-
可选的
Fiber::Scheduler#blocking_operation_wait
钩子允许将阻塞操作移出事件循环,以减少延迟并提高多核处理器利用率。 [特性 #20876]
-
-
-
IO::Buffer#copy
可以释放 GVL,允许其他线程在复制数据时运行。 [特性 #20902]
-
-
-
当返回值很大时,
Integer#**
过去返回Float::INFINITY
,但现在返回一个Integer
。如果返回值非常大,则会引发异常。 [特性 #20811]
-
-
-
Object#singleton_method
现在返回预先添加到或包含在接收者单例类中的模块中的方法。 [Bug #20620]o = Object.new o.extend(Module.new{def a = 1}) o.singleton_method(:a).call #=> 1
-
-
-
允许在
Ractor
中require
。require 进程将在主Ractor
上运行。添加了Ractor._require(feature)
以在主Ractor
上运行 require 进程。 [特性 #20627] -
添加了
Ractor.main?
。 [特性 #20627] -
添加了
Ractor.[]
和Ractor.[]=
以访问当前Ractor
的 ractor 本地存储。 [特性 #20715] -
添加了
Ractor.store_if_absent(key){ init }
,以线程安全的方式初始化 ractor 本地变量。 [特性 #20875]
-
-
-
如果范围不可迭代,
Range#size
现在会引发TypeError
。 [杂项 #18984] -
Range#step
现在始终具有通过对所有类型(不仅仅是数字)使用+
运算符进行迭代的语义。 [特性 #18368](Time.utc(2022, 2, 24)..).step(24*60*60).take(3) #=> [2022-02-24 00:00:00 UTC, 2022-02-25 00:00:00 UTC, 2022-02-26 00:00:00 UTC]
-
-
-
当返回值的分子很大时,
Rational#**
过去返回Float::INFINITY
或Float::NAN
,但现在返回一个Rational
。如果它非常大,则会引发异常。 [特性 #20811]
-
-
-
添加了
RubyVM::AbstractSyntaxTree::Node#locations
方法,该方法返回与 AST 节点关联的位置对象。 [特性 #20624] -
添加了
RubyVM::AbstractSyntaxTree::Location
类,该类保存位置信息。 [特性 #20624]
-
-
-
添加了
String#append_as_bytes
,以便更轻松高效地处理二进制缓冲区和协议。它直接将参数连接到字符串中,而无需任何编码验证或转换。 [特性 #20594]
-
-
-
当
Symbol#to_s
返回的字符串被修改时,现在会发出弃用警告,并且在 Ruby 的未来版本中将被冻结。可以使用-W:deprecated
或设置Warning[:deprecated] = true
来启用这些警告。 [特性 #20350]
-
-
-
在 Windows 上,如果系统时区名称包含非 ASCII 字符,则
Time#zone
现在以 UTF-8 编码系统时区名称,而不是活动代码页。 [Bug #20929] -
Time#xmlschema
及其别名Time#iso8601
已被移动到核心Time
类中,而之前它是由time
gem 提供的扩展。 [特性 #20707]
-
-
-
添加了
Warning.categories
方法,该方法返回可能的警告类别列表。 [特性 #20293]
-
标准库更新¶ ↑
我们只列出值得注意的功能变更的标准库更改。
-
RubyGems
-
为 gem push 添加了
--attestation
选项。它能够将构建工件的签名存储到 sigstore.dev。 -
为 gem push 添加了
--attestation
选项。它能够将构建工件的签名存储到 sigstore.dev。
-
-
-
添加了一个
lockfile_checksums
配置,以在新的锁定文件中包含校验和。 -
添加了 bundle lock
--add-checksums
以将校验和添加到现有的锁定文件中。
-
-
-
性能改进,
JSON.parse
比 json-2.7.x 快约 1.5 倍。
-
-
-
为
Tempfile.create
实现了关键字参数anonymous: true
。Tempfile.create(anonymous: true)
会立即删除创建的临时文件。因此,应用程序不需要删除该文件。 [特性 #20497]
-
-
win32/sspi.rb
-
此库现在从 Ruby 存储库提取到 ruby/net-http-sspi。 [特性 #20775]
-
-
IRB
-
默认情况下,交互式方法补全现在通过类型信息得到改进。 [特性 #20778]
-
其他更改在以下部分中列出。我们还列出了自之前的捆绑版本 Ruby 3.3.0 以来的发布历史(如果有 GitHub 发布)。
添加了以下默认 gem。
-
win32-registry 0.1.0
更新了以下默认 gem。
-
RubyGems 3.6.2
-
benchmark(基准测试) 0.4.0
-
0.3.0 到 v0.4.0
-
-
bundler 2.6.2
-
date(日期) 3.4.1
-
delegate(委托) 0.4.0
-
0.3.1 到 v0.4.0
-
-
did_you_mean(你是不是想说) 2.0.0
-
1.6.3 到 v2.0.0
-
-
digest(摘要) 3.2.0
-
3.1.1 到 v3.2.0.pre0, v3.2.0
-
-
erb 4.0.4
-
4.0.3 到 v4.0.4
-
-
error_highlight(错误高亮) 0.7.0
-
0.6.0 到 [v0.7.0]
-
-
etc 1.4.5
-
fcntl 1.2.0
-
1.1.0 到 v1.2.0
-
-
fiddle 1.1.6
-
fileutils 1.7.3
-
1.7.2 到 v1.7.3
-
-
io-console 0.8.0
-
0.7.1 到 v0.7.2, v0.8.0.beta1, v0.8.0
-
-
io-nonblock 0.3.1
-
0.3.0 到 v0.3.1
-
-
ipaddr 1.2.7
-
1.2.6 到 v1.2.7
-
-
irb 1.14.3
-
json 2.9.1
-
logger(日志) 1.6.4
-
net-http 0.6.0
-
open-uri 0.5.0
-
0.4.1 到 v0.5.0
-
-
optparse 0.6.0
-
ostruct 0.6.1
-
0.6.0 到 v0.6.1
-
-
pathname 0.4.0
-
0.3.0 到 v0.4.0
-
-
pp 0.6.2
-
prism 1.2.0
-
pstore 0.1.4
-
0.1.3 到 v0.1.4
-
-
psych 5.2.2
-
5.1.2 到 v5.2.0.beta1, v5.2.0.beta2, v5.2.0.beta3, v5.2.0.beta4, v5.2.0.beta5, v5.2.0.beta6, v5.2.0.beta7, v5.2.0, v5.2.1, v5.2.2
-
-
rdoc 6.10.0
-
reline 0.6.0
-
resolv 0.6.0
-
securerandom 0.4.1
-
set 1.1.1
-
1.1.0 到 v1.1.1
-
-
shellwords 0.2.2
-
singleton 0.3.0
-
0.2.0 到 v0.3.0
-
-
stringio 3.1.2
-
strscan 3.1.2
-
syntax_suggest 2.0.2
-
tempfile 0.3.1
-
time 0.4.1
-
timeout 0.4.3
-
tmpdir 0.3.1
-
uri 1.0.2
-
win32ole 1.9.1
-
yaml 0.4.0
-
0.3.0 到 v0.4.0
-
-
zlib 3.2.1
添加了以下捆绑 gem。
-
repl_type_completor 0.1.9
更新了以下捆绑 gem。
-
minitest 5.25.4
-
5.20.0 到 v5.25.4
-
-
power_assert 2.0.5
-
rake 13.2.1
-
test-unit 3.6.7
-
rexml 3.4.0
-
rss 0.3.1
-
0.3.0 到 0.3.1
-
-
net-ftp 0.3.8
-
net-imap 0.5.4
-
net-smtp 0.5.0
-
prime 0.1.3
-
0.1.2 到 v0.1.3
-
-
rbs 3.8.0
-
3.4.0 到 v3.4.1, v3.4.2, v3.4.3, v3.4.4, v3.5.0.pre.1, v3.5.0.pre.2, v3.5.0, v3.5.1, v3.5.2, v3.5.3, v3.6.0.dev.1, v3.6.0.pre.1, v3.6.0.pre.2, v3.6.0.pre.3, v3.6.0, v3.6.1, v3.7.0.dev.1, v3.7.0.pre.1, v3.7.0, v3.8.0.pre.1 v3.8.0
-
-
typeprof 0.30.1
-
0.21.9 到 v0.30.1
-
-
debug 1.10.0
-
racc 1.8.1
以下捆绑的 gem 从默认 gem 提升。
-
mutex_m 0.3.0
-
0.2.0 到 v0.3.0
-
-
getoptlong 0.2.1
-
base64 0.2.0
-
bigdecimal 3.1.8
-
observer 0.1.2
-
abbrev 0.1.2
-
resolv-replace 0.1.1
-
rinda 0.2.0
-
drb 2.2.1
-
2.2.0 到 v2.2.1
-
-
nkf 0.2.0
-
0.1.3 到 v0.2.0
-
-
syslog 0.2.0
-
0.1.2 到 v0.2.0
-
-
csv 3.3.2
支持的平台¶ ↑
兼容性问题¶ ↑
-
错误消息和回溯显示已更改。
-
使用单引号而不是反引号作为开头引号。[Feature #16495]
-
在方法名称之前显示类名(仅当类具有永久名称时)。[Feature #19117]
-
回溯中不再提供额外的
rescue
/ensure
帧。[Feature #20275] -
Kernel#caller
,Thread::Backtrace::Location
的方法等也相应地更改了。旧
test.rb:1:in `foo': undefined method `time' for an instance of Integer from test.rb:2:in `<main>'
新
test.rb:1:in 'Object#foo': undefined method 'time' for an instance of Integer from test.rb:2:in '<main>'
-
-
Hash#inspect
的渲染已更改。[Bug #20433]-
Symbol
键使用现代的符号键语法显示:"{user: 1}"
-
其他键现在在
=>
周围有空格:'{"user" => 1}'
,而以前没有:'{"user"=>1}'
-
-
Kernel#Float()
现在接受省略小数部分的十进制字符串。[Feature #20705]Float("1.") #=> 1.0 (previously, an ArgumentError was raised) Float("1.E-1") #=> 0.1 (previously, an ArgumentError was raised)
-
String#to_f
现在接受省略小数部分的十进制字符串。[Feature #20705] 请注意,当指定指数时,结果会发生变化。"1.".to_f #=> 1.0 "1.E-1".to_f #=> 0.1 (previously, 1.0 was returned)
-
Refinement#refined_class
已删除。[Feature #19714]
标准库兼容性问题¶ ↑
-
-
DidYouMean::SPELL_CHECKERS[]=
和DidYouMean::SPELL_CHECKERS.merge!
已删除。
-
-
-
删除了以下已弃用的常量
-
Net::HTTP::ProxyMod
-
Net::NetPrivate::HTTPRequest
-
Net::HTTPInformationCode
-
Net::HTTPSuccessCode
-
Net::HTTPRedirectionCode
-
Net::HTTPRetriableCode
-
Net::HTTPClientErrorCode
-
Net::HTTPFatalErrorCode
-
Net::HTTPServerErrorCode
-
Net::HTTPResponseReceiver
-
Net::HTTPResponceReceiver
-
这些常量自 2012 年起已弃用。
-
-
-
拒绝为
Timeout.timeout
使用负值。[Bug #20795]
-
-
-
默认解析器从符合 RFC 2396 标准切换到符合 RFC 3986 标准。[Bug #19266]
-
C API 更新¶ ↑
-
rb_newobj
和rb_newobj_of
(以及相应的宏RB_NEWOBJ
,RB_NEWOBJ_OF
,NEWOBJ
,NEWOBJ_OF
) 已删除。[Feature #20265] -
删除了已弃用的函数
rb_gc_force_recycle
。[Feature #18290]
实现改进¶ ↑
-
默认解析器现在是
Prism
。要使用传统的解析器,请使用命令行参数--parser=parse.y
。[Feature #20564] -
Happy Eyeballs 版本 2 (RFC8305),一种通过同时尝试 IPv6 和 IPv4 来确保更快、更可靠的连接的算法,在
Socket.tcp
和TCPSocket.new
中使用。 要全局禁用它,请设置环境变量RUBY_TCP_NO_FAST_FALLBACK=1
或调用Socket.tcp_fast_fallback=false
。或者要在每个方法的基础上禁用它,请使用关键字参数fast_fallback: false
。[Feature #20108] [Feature #20782] -
可以通过模块化垃圾收集器功能动态加载替代垃圾收集器 (
GC
) 实现。要启用此功能,请在构建时使用--with-modular-gc
配置 Ruby。GC
库可以使用环境变量RUBY_GC_LIBRARY
在运行时加载。[Feature #20351] -
Ruby 的内置垃圾收集器已拆分为
gc/default/default.c
中的单独文件,并使用gc/gc_impl.h
中定义的 API 与 Ruby 交互。 内置垃圾收集器现在也可以使用make modular-gc MODULAR_GC=default
构建为库,并使用环境变量RUBY_GC_LIBRARY=default
启用。[Feature #20470] -
基于 MMTk 提供了一个实验性的
GC
库。可以使用make modular-gc MODULAR_GC=mmtk
构建此GC
库,并使用环境变量RUBY_GC_LIBRARY=mmtk
启用。这需要在构建机器上安装 Rust 工具链。[Feature #20860]
YJIT¶ ↑
新功能¶ ↑
-
命令行选项
-
--yjit-mem-size
引入了一个统一的内存限制(默认 128MiB)来跟踪 YJIT 的总内存使用量,为旧的--yjit-exec-mem-size
选项提供了更直观的替代方案。 -
--yjit-trace-exits=COUNTER
允许跟踪已计数的退出和回退。 -
--yjit-perf=codegen
允许基于 YJIT 的代码生成函数对 JIT 代码进行分析。 -
--yjit-log
启用编译日志以跟踪编译的内容。
-
-
Ruby API
-
RubyVM::YJIT.enable(log: true)
也启用编译日志。 -
RubyVM::YJIT.log
提供对运行时编译日志尾部的访问权限。
-
-
YJIT 统计信息
-
RubyVM::YJIT.runtime_stats
现在始终提供有关失效、内联和元数据编码的其他统计信息。 -
RubyVM::YJIT.runtime_stats[:iseq_calls]
已添加以分析未内联的 Ruby 方法调用。 -
RubyVM::YJIT.runtime_stats[:cfunc_calls]
截断为前 20 个条目,以获得更好的性能。
-
新优化¶ ↑
-
压缩上下文减少了存储 YJIT 元数据所需的内存
-
为局部变量和 Ruby 方法参数分配寄存器
-
启用 YJIT 时,使用更多用 Ruby 编写的 Core 原语
-
Array#each
,Array#select
,Array#map
在 Ruby 中重写以获得更好的性能。[Feature #20182].
-
-
能够内联小型/琐碎的方法,例如
-
空方法
-
返回常量的方法
-
返回
self
的方法 -
直接返回参数的方法
-
-
为更多运行时方法提供专门的代码生成
-
优化
String#getbyte
、String#setbyte
和其他字符串方法 -
优化位操作,以加速底层位/字节操作
-
支持多actor模式下的可共享常量
-
其他各种增量优化
其他杂项更改¶ ↑
-
向未使用传入块的方法传递块,在详细模式 (
-w
) 下会显示警告。 与此相关,引入了一个新的strict_unused_block
警告类别。 使用-W:strict_unused_block
或Warning[:strict_unused_block] = true
启用它们。 [功能 #15554] -
重新定义一些由解释器和 JIT 特别优化的核心方法,例如
String#freeze
或Integer#+
,现在会发出性能类警告 (-W:performance
或Warning[:performance] = true
)。 [功能 #20429]