NEWS for Ruby 3.4.0
本文档列出了自 3.3.0 版本以来用户可见的功能更改,不包括 bug 修复。
请注意,每个条目都保持得尽可能简洁,详情请参阅链接。
语言更改
-
添加了
it来引用块参数。 [Feature #18980] -
在没有
frozen_string_literal注释的文件中,String字面量现在会在被修改时发出弃用警告。这些警告可以通过-W:deprecated启用,或通过设置Warning[:deprecated] = true来启用。要禁用此更改,您可以使用--disable-frozen-string-literal命令行参数运行 Ruby。 [Feature #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]时会发出警告。 [Feature #20884]
核心类更新
注意:此处仅列出重要的类更新。
-
-
添加了
Array#fetch_values。 [Feature #20702]
-
-
-
Exception#set_backtrace现在接受Thread::Backtrace::Location的数组。、Kernel#raiseThread#raise和Fiber#raise也接受这种新格式。 [Feature #13557]
-
-
-
可选的
Fiber::Scheduler#blocking_operation_wait钩子允许将阻塞操作移出事件循环,以减少延迟并提高多核处理器利用率。 [Feature #20876]
-
-
-
添加了
GC.config,允许设置垃圾收集器的配置变量。 [Feature #20443] -
引入了
GC配置参数rgengc_allow_full_mark。当设置为false时,GC只标记年轻对象。默认为true。 [Feature #20443]
-
-
-
Hash.new现在接受一个可选的capacity:参数,以预先分配哈希的容量。这可以通过节省重新分配和重新哈希键的开销来提高增量构建大型哈希的性能。 [Feature #19236]
-
-
-
IO::Buffer#copy可以释放 GVL,允许其他线程在复制数据时运行。 [Feature #20902]
-
-
-
Integer#**以前在返回值很大时返回Float::INFINITY,但现在返回一个Integer。如果返回值非常大,则会引发异常。 [Feature #20811]
-
-
-
Object#singleton_method现在会返回在混入或包含到接收器单例类中的模块中的方法。 [Bug #20620]o = Object.new o.extend(Module.new{def a = 1}) o.singleton_method(:a).call #=> 1
-
-
-
允许在
Ractor中使用require。正在请求的进程将在主Ractor上运行。添加了Ractor._require(feature)来在主Ractor上运行请求进程。 [Feature #20627] -
添加了
Ractor.main?。 [Feature #20627] -
添加了
Ractor.[]和Ractor.[]=来访问当前Ractor的 ractor 本地存储。 [Feature #20715] -
添加了
Ractor.store_if_absent(key){ init }来在线程安全的环境中初始化 ractor 本地变量。 [Feature #20875]
-
-
-
如果范围不可迭代,
Range#size现在会引发TypeError。 [Misc #18984] -
Range#step现在对于所有类型(不仅仅是数字)都一致地使用+运算符进行迭代。 [Feature #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。如果它非常大,则会引发异常。 [Feature #20811]
-
-
-
添加了
RubyVM::AbstractSyntaxTree::Node#locations方法,该方法返回与 AST 节点关联的位置对象。 [Feature #20624] -
添加了
RubyVM::AbstractSyntaxTree::Location类,该类保存位置信息。 [Feature #20624]
-
-
-
添加了
String#append_as_bytes,以便更轻松、更高效地处理二进制缓冲区和协议。它直接将参数连接到字符串中,而无需进行任何编码验证或转换。 [Feature #20594]
-
-
-
由
Symbol#to_s返回的字符串现在在被修改时会发出弃用警告,并在未来的 Ruby 版本中被冻结。这些警告可以通过-W:deprecated启用,或通过设置Warning[:deprecated] = true来启用。 [Feature #20350]
-
-
-
在 Windows 上,如果系统时区名称包含非 ASCII 字符,
Time#zone现在会以 UTF-8 编码系统时区名称,而不是使用活动代码页。 [Bug #20929] -
Time#xmlschema及其别名Time#iso8601已从timegem 提供的扩展移至核心Time类。 [Feature #20707]
-
-
-
添加了
Warning.categories方法,该方法返回可能的警告类别列表。 [Feature #20293]
-
标准库更新
我们只列出重要的标准库功能更改。
-
RubyGems
-
为 gem push 添加了
--attestation选项。它允许将构建工件的签名存储到 sigstore.dev。
-
-
-
为 fresh lockfiles 添加了
lockfile_checksums配置,以包含校验和。 -
为 bundle lock 添加了
--add-checksums,以将校验和添加到现有的 lockfile。
-
-
-
性能改进
JSON.parse比 json-2.7.x 快约 1.5 倍。
-
-
-
为
Tempfile.create实现了一个可选的关键字参数anonymous: true。Tempfile.create(anonymous: true)会立即删除创建的临时文件。因此,应用程序无需手动删除文件。 [Feature #20497]
-
-
win32/sspi.rb
-
此库已从 Ruby 存储库提取到 ruby/net-http-sspi。 [Feature #20775]
-
-
IRB
-
交互式方法完成现在默认使用类型信息进行改进。 [Feature #20778]
-
其他更改列在本节之后。如果之前的捆绑版本 Ruby 3.3.0 有 GitHub 发布,我们也列出了这些发布历史。
添加了以下默认 gem。
-
win32-registry 0.1.0
更新了以下默认 gem。
-
RubyGems 3.6.2
-
benchmark 0.4.0
-
bundler 2.6.2
-
date 3.4.1
-
delegate 0.4.0
-
did_you_mean 2.0.0
-
digest 3.2.0
-
erb 4.0.4
-
error_highlight 0.7.0
-
etc 1.4.5
-
fcntl 1.2.0
-
fiddle 1.1.6
-
fileutils 1.7.3
-
io-console 0.8.0
-
io-nonblock 0.3.1
-
ipaddr 1.2.7
-
irb 1.14.3
-
json 2.9.1
-
logger 1.6.4
-
net-http 0.6.0
-
open-uri 0.5.0
-
openssl 3.3.0
-
optparse 0.6.0
-
ostruct 0.6.1
-
pathname 0.4.0
-
pp 0.6.2
-
prism 1.2.0
-
pstore 0.1.4
-
psych 5.2.2
-
rdoc 6.10.0
-
reline 0.6.0
-
resolv 0.6.0
-
securerandom 0.4.1
-
set 1.1.1
-
shellwords 0.2.2
-
singleton 0.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
-
zlib 3.2.1
-
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 被提升。
-
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#callerThread::Backtrace::Location的方法等也相应地进行了更改。Old
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) 算法在
Socket.tcp和TCPSocket.new中使用,该算法通过同时尝试 IPv6 和 IPv4 连接来确保更快、更可靠的连接。要全局禁用它,请设置环境变量RUBY_TCP_NO_FAST_FALLBACK=1或调用Socket.tcp_fast_fallback=false。或者,要按方法禁用它,请使用关键字参数fast_fallback: false。 [Feature #20108] [Feature #20782] -
可以通过模块化垃圾收集器功能动态加载替代垃圾收集器(
GC)实现。要启用此功能,请在构建时使用--with-modular-gc配置 Ruby。可以使用环境变量RUBY_GC_LIBRARY在运行时加载GC库。 [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 的 codegen 函数对 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 编写的核心原始类型
-
Array#each、Array#select、Array#map使用 Ruby 重写以提高性能 [Feature #20182]。
-
-
能够内联小型/琐碎的方法,例如
-
空方法
-
返回常量的函数
-
返回
self的函数 -
直接返回参数的函数
-
-
对许多运行时方法进行专门的 codegen
-
优化
String#getbyte、String#setbyte及其他字符串方法 -
优化按位操作,加速底层位/字节操作
-
支持多ractor模式下的可共享常量
-
其他各种增量优化
杂项更改
-
将一个块传递给不使用该块的方法时,在 verbose 模式 (
-w) 下会发出警告。为此,引入了一个新的strict_unused_block警告类别。使用-W:strict_unused_block或Warning[:strict_unused_block] = true开启它们。[Feature #15554] -
重定义一些被解释器和 JIT 特别优化的核心方法,例如
String#freeze或Integer#+,现在会发出性能级别警告 (-W:performance或Warning[:performance] = true)。[Feature #20429]