NEWS for Ruby 2.5.0¶ ↑
本文档列出了版本之间用户可见的功能更改,不包括错误修复。
请注意,每个条目都保持简洁,没有提供任何原因或参考信息。有关包含所有足够信息的完整更改列表,请参阅 ChangeLog 文件或 Redmine (例如 https://bugs.ruby-lang.org/issues/$FEATURE_OR_BUG_NUMBER
)
自 2.4.0 版本以来的更改¶ ↑
语言更改¶ ↑
-
删除了顶层常量查找。[特性 #11547]
-
允许在 do/end 代码块内部使用 rescue/else/ensure。[特性 #12906]
-
细化(refinements)在字符串插值中生效。[特性 #13812]
核心类更新(仅限突出部分)¶ ↑
-
-
新方法
-
Array#append
[特性 #12746] -
Array#prepend
[特性 #12746]
-
-
-
-
已弃用。它是 C 扩展的基本类,没有必要在 Ruby 级别公开。[特性 #3072]
-
-
-
新方法
-
Exception#full_message
用于检索异常的String
表达式,其格式与 Ruby 打印未捕获的异常的方式相同。[特性 #14141] [实验性]
-
-
-
-
Dir.glob
提供新的可选关键字参数:base
。[特性 #13056] -
Dir.chdir
(没有块参数)、Dir.open
、Dir.new
、Dir.mkdir
、Dir.rmdir
、Dir.empty?
释放 GVL -
新方法
-
Dir.children
[特性 #11302] -
Dir.each_child
[特性 #11302]
-
-
-
-
Enumerable#any?
、Enumerable#all?
、Enumerable#none?
和Enumerable#one?
接受模式参数。[特性 #11286]
-
-
-
File.open
接受:newline
选项来表示文本模式。[错误 #13350] -
File#path
对于使用 File::Constants::TMPFILE 选项打开的文件引发IOError
。[特性 #13568] -
File.stat
、File.exist?
和其他使用rb_stat()
的方法释放 GVL。[错误 #13941] -
File.rename
释放 GVL。[特性 #13951] -
File::Stat#atime
、File::Stat#mtime
和File::Stat#ctime
在 Windows 8 及更高版本上支持小数秒时间戳。[特性 #13726] -
File::Stat#ino
和File.identical?
在 Windows 8.1 及更高版本上支持 ReFS 128 位 ino。[特性 #13731] -
File.readable?
、File.readable_real?
、File.writable?
、File.writable_real?
、File.executable?
、File.executable_real?
、File.mkfifo
、File.readlink
、File.truncate
、File#truncate
、File.chmod
、File.lchmod
、File.chown
、File.lchown
、File.unlink
、File.utime
、File.lstat
释放 GVL -
新方法
-
File.lutime
[特性 #4052]
-
-
-
-
新方法
-
Hash#transform_keys
[特性 #13583] -
Hash#transform_keys!
[特性 #13583] -
Hash#slice
[特性 #8499]
-
-
-
-
IO.copy_stream
尝试使用 copy_file_range(2) 进行复制卸载。[特性 #13867] -
新方法
-
-
-
IO#close
可能会引发消息为“stream closed”的错误,但它被细化为“stream closed in another thread”。新消息对于用户来说更加清晰。[错误 #13405]
-
-
-
Integer#round
、Integer#floor
、Integer#ceil
和Integer#truncate
始终返回一个Integer
。[错误 #13420] -
Integer#pow
接受模参数来计算模幂。[特性 #12508] [特性 #11003] -
新方法
-
Integer#allbits?
、Integer#anybits?
、Integer#nobits?
[特性 #12753] -
Integer.sqrt
[特性 #13219]
-
-
-
-
Kernel#yield_self
[特性 #6721] -
Kernel#pp
[特性 #14123] -
Kernel#warn
(…, uplevel:n) [特性 #12882]
-
-
-
新方法
-
Method#===
调用Method#call
,与Proc#===
相同。[特性 #14142]
-
-
-
-
Module#attr
、Module#attr_accessor
、Module#attr_reader
和Module#attr_writer
变为公共的。[特性 #14132] -
Module#define_method
、Module#alias_method
、Module#undef_method
和Module#remove_method
变为公共的。[特性 #14133]
-
-
-
Numeric#step
在给定无法与 #> 和 0 比较的步长值时,不再隐藏 coerce 方法中的错误。[特性 #7688] -
数值比较运算符 (<,<=,>=,>) 不再隐藏内部 coerce 方法中的异常。如果强制转换不可能,则在 coerce 中返回 nil。[特性 #7688]
-
-
-
如果存在 getrusage(2),则
Process.times
的精度得到提高。[特性 #11952] -
新方法
-
Process.last_status
是 $? 的别名。[特性 #14043]
-
-
-
-
当使用 #<=> 比较 begin 和 end 时,Range#initialize 不再隐藏异常,并引发 “bad value for range”
ArgumentError
,而是让 #<=> 调用的异常通过。[特性 #7688]
-
-
-
更新到 Onigmo 6.1.3-669ac9997619954c298da971fcfacccf36909d05。
-
支持不存在运算符 github.com/k-takata/Onigmo/issues/82
-
-
支持 5 个新的与表情符号相关的 Unicode 字符属性
-
-
-
String#-@
去除未冻结字符串的重复项。为了兼容性,已冻结的字符串保持不变。[特性 #13077] -
-"literal"
(String#-@
) 优化为返回相同的对象(与 Ruby 2.1+ 中的"literal".freeze
相同)[特性 #13295] -
对于非字符串参数,
String#casecmp
和String#casecmp?
返回 nil,而不是引发TypeError
。[错误 #13312] -
String#start_with?
接受正则表达式。[特性 #13712] -
新方法
-
String#delete_prefix
、String#delete_prefix!
[特性 #12694] -
String#delete_suffix
、String#delete_suffix!
[特性 #13665] -
String#each_grapheme_cluster
和String#grapheme_clusters
用于枚举字形簇。[特性 #13780] -
String#undump
用于取消转义String#dump
后的字符串。[特性 #12275]
-
-
-
-
Struct.new
接受 'keyword_init: true' 选项,以便使用关键字参数初始化成员。[特性 #11925]
-
-
Regexp/String:将 Unicode 版本从 9.0.0 更新到 10.0.0 [特性 #13685]
-
-
由
Thread#name=
设置的描述现在在 Windows 10 上可见。 -
新方法
-
Thread#fetch
[特性 #13009]
-
-
Thread.report_on_exception
的默认值现在为 true,在 $stderr 上显示终止线程的未处理异常。[特性 #14143]
-
-
-
Time.at
接收第三个参数,该参数指定第二个参数的单位。[特性 #13919]
-
-
-
新方法
-
KeyError#receiver
[特性 #12063] -
KeyError#key
[特性 #12063]
-
-
-
-
新的异常类。[特性 #13224]
-
标准库更新(仅限突出部分)¶ ↑
-
BigDecimal
-
更新到 BigDecimal 1.3.4
-
添加了以下功能
-
BigDecimal::VERSION
-
-
以下功能已被弃用,并计划在 1.4.0 版本中删除
-
BigDecimal.new
-
BigDecimal.ver
-
-
BigDecimal#clone 和 dup 现在不会创建新的实例,而是返回接收者本身。
-
-
覆盖率
-
支持分支覆盖率和方法覆盖率测量。[功能 #13901] 分支覆盖率会告诉你哪些分支被执行,哪些没有被执行。
Method
方法覆盖率会告诉你哪些方法被调用,哪些没有被调用。通过运行具有此新功能的测试套件,你可以了解测试执行了哪些分支和方法,并更严格地评估测试套件的总覆盖率。你可以通过 `Coverage.start` 的选项来指定测量目标。
Coverage.start(lines: true, branches: true, methods: true)
加载一些 Ruby 文件后,你可以使用 `Coverage.result` 来获取覆盖率结果。
Coverage.result #=> { "/path/to/file.rb"=> # { :lines => [1, 2, 0, nil, ...], # :branches => # { [:if, 0, 2, 1, 6, 4] => # { [:then, 1, 3, 2, 3, 8] => 0, # [:else, 2, 5, 2, 5, 8] => 2 # } # }, # :methods => { # [Object, :foo, 1, 0, 7, 3] => 2 # } # } # }
行覆盖率的结果类型没有改变;它只是一个包含数字的数组,表示每行被执行的次数,或者包含 `nil`,表示该行不相关。
分支覆盖率的结果类型是
{ (jump base) => { (jump target) => (counter) } }
其中跳转的基准和目标具有以下格式:
[type, unique-id, start lineno, start column, end lineno, end column]
例如,`[:if, 0, 2, 1, 6, 4]` 表示一个 `if` 语句,其范围从第 2 行第 1 列到第 6 行第 4 列。 `[:then, 1, 3, 2, 3, 8]` 表示一个 `then` 子句,其范围从第 3 行第 2 列到第 3 行第 8 列。请注意,行号从 1 开始,列号从 0 开始。因此,上面的例子显示从 `if` 到 `then` 的分支从未执行,而从 `if` 到 `else` 的分支执行了两次。
方法覆盖率的结果类型是
{ (method key) => (counter) }
其中方法键具有以下格式:
[class, method-name, start lineno, start column, end lineno, end column]
例如,`[Object, :foo, 1, 0, 7, 3]` 表示 `Object#foo`,其范围从第 1 行第 0 列到第 7 行第 3 列。上面的示例显示 `Object#foo` 被调用了两次。
注意:为了保持兼容性,不向 `Coverage.start` 传递任何选项将仅测量行覆盖率,并且 `Coverage.result` 将返回旧格式。
Coverage.result #=> { "/path/to/file.rb"=> [1, 2, 0, nil, ...] }
-
-
DRb
-
ACL::ACLEntry.new 不再抑制 IPAddr::InvalidPrefixError。
-
-
ERB
-
添加 ERB#result_with_hash 以使用
Hash
对象传递的局部变量来渲染模板。[功能 #8631] -
在 erb 命令中,默认模板文件编码从 ASCII-8BIT 更改为 UTF-8。[缺陷 #14095]
-
如果指定并使用了 trim_mode,则回车符将被正确修剪。在 Windows 上将删除重复的换行符。[缺陷 #5339] [缺陷 #11464]
-
-
IPAddr
-
IPAddr 不再接受无效的地址掩码。[缺陷 #13399]
-
IPAddr#ipv4_compat 和 IPAddr#ipv4_compat? 被标记为已弃用。[缺陷 #13769]
-
新方法
-
IPAddr#prefix
-
IPAddr#loopback?
-
IPAddr#private? [功能 #11666]
-
IPAddr#link_local? [功能 #10912]
-
-
-
IRB
-
反向打印回溯和错误消息 [功能 #8661] [实验性]
-
“binding.irb” 自动 require irb 并运行 [缺陷 #13099] [实验性]
-
“binding.irb” 在启动时显示调用该行的周围源代码 [功能 #14124]
-
-
Matrix
-
新方法
-
Matrix.combine 和 Matrix#combine [功能 #10903]
-
Matrix#hadamard_product 和 Matrix#entrywise_product
-
-
-
Net::HTTP
-
Net::HTTP.new 支持 no_proxy 参数 [功能 #11195]
-
Net::HTTP#min_version 和 Net::HTTP#max_version [功能 #9450]
-
添加更多 HTTP 状态类
-
Net::HTTP::STATUS_CODES 作为 HTTP 状态代码存储库添加 [杂项 #12935]
-
如果系统的环境变量是多用户安全的,则 Net::HTTP#proxy_user 和 Net::HTTP#proxy_pass 反映 http_proxy 环境变量。[缺陷 #12921]
-
-
open-uri
-
URI.open 方法定义为 open-uri 的
Kernel.open
的别名。 open-uri 的Kernel.open
将在未来被弃用。
-
-
OpenSSL
-
将 Ruby/OpenSSL 从 2.0 版本更新到 2.1 版本。更改记录在 ext/openssl/History.md 的“Version 2.1.0”部分。
-
-
Pathname
-
新方法
-
Pathname#glob [功能 #7360]
-
-
-
Psych
-
更新到 Psych 3.0.2。
-
将 fallback 选项转换为关键字参数 github.com/ruby/psych/pull/342
-
为 Psych.load、Psych.safe_load 添加 :symbolize_names 选项,类似于 JSON.parse github.com/ruby/psych/pull/333, github.com/ruby/psych/pull/337
-
添加 Psych::Handler#event_location github.com/ruby/psych/pull/326
-
使冻结字符串字面量 = true github.com/ruby/psych/pull/320
-
反序列化时间时保留时区偏移量 github.com/ruby/psych/pull/316
-
删除 syck gem 的已弃用方法别名 github.com/ruby/psych/pull/312
-
-
-
RbConfig
-
添加 RbConfig::LIMITS 以提供 C 类型的限制。这在加载 rbconfig/sizeof 时可用。
-
-
Ripper
-
Ripper::EXPR_BEG 等用于 Ripper#state。
-
新方法
-
Ripper#state 用于告知扫描器的状态。[功能 #13686]
-
-
-
-
更新到
RDoc
6.0.1。-
将基于 IRB 的词法分析器替换为 Ripper。
-
这大大提高了生成文档的速度。
-
它还有助于将来支持新的语法。
-
支持过去几年 Ruby 的许多新语法。
-
使用“frozen_string_literal: true”。性能调查:gist.github.com/aycabta/abdfaa75ea8a6877eeb734e942e73800
-
支持 did_you_mean。
-
-
-
Rubygems
-
更新到 Rubygems 2.7.3。
-
-
SecureRandom
-
新方法
-
SecureRandom.alphanumeric
-
-
-
Set
-
新方法
-
Set#to_s 作为 inspect 的别名 [功能 #13676]
-
Set#=== 作为 include? 的别名 [功能 #13801]
-
Set#reset [功能 #6589]
-
-
-
StringIO
-
StringIO#write 接受多个参数
-
-
StringScanner
-
新方法
-
StringScanner#size、StringScanner#captures、StringScanner#values_at [功能 #836]
-
-
-
URI
-
相对路径操作不再将连续的斜杠折叠为单个斜杠。[缺陷 #8352]
-
-
WEBrick
-
添加服务器名称指示 (SNI) 支持 [功能 #13729]
-
支持
Proc
对象作为正文响应 [功能 #855] -
作为 RubyGem 发布 [功能 #13173]
-
避免
Kernel#open
产生意外行为 [杂项 #14216]
-
-
Zlib
-
Zlib::GzipWriter#write 接受多个参数
-
兼容性问题(不包括功能错误修复)¶ ↑
-
BasicSocket
-
BasicSocket#read_nonblock 和 BasicSocket#write_nonblock 不再将 O_NONBLOCK 文件描述符标志设置为副作用(仅在 Linux 上) [功能 #13362]
-
-
-
Random.raw_seed 重命名为
Random.urandom
。 由于 [缺陷 #9569],它现在适用于非种子用途。
-
-
Socket
-
添加 Socket::Ifaddr#vhid [功能 #13803]
-
-
为了提高速度,重新实现了 ConditionVariable、Queue 和 SizedQueue。 它们不再继承
Struct
。[功能 #13552]
Stdlib 兼容性问题(不包括功能错误修复)¶ ↑
-
Gem 化
-
将以下标准库提升为默认 gem。
-
cmath
-
csv
-
date
-
dbm
-
etc
-
fcntl
-
fiddle
-
fileutils
-
gdbm
-
ipaddr
-
scanf
-
sdbm
-
stringio
-
strscan
-
webrick
-
zlib
-
-
-
Logger
-
Logger.new(“| command”) 曾经无意中打开一个命令。 它被禁止了,现在 Logger#initialize 只将
String
参数视为文件名,符合其规范。[缺陷 #14212]
-
-
Net::HTTP
-
Net::HTTP#start 现在默认将 :ENV 传递给 p_addr。[缺陷 #13351] 要避免这种情况,请显式传递 nil。
-
-
mathn.rb
-
从 stdlib 中移除。[功能 #10169]
-
-
Rubygems
-
从 stdlib 中删除了“ubygems.rb”文件。 自 Ruby 1.9 以来,它是多余的。
-
支持的平台更改¶ ↑
-
放弃对 NaCl 平台的支持
实现改进¶ ↑
-
(这可能不是“用户可见的功能更改”,但)
Hash
类的哈希函数现在是 SipHash13。[功能 #13017] -
SecureRandom 现在比 OpenSSL 更倾向于使用操作系统提供的源。[缺陷 #9569]
-
Mutex 重写得更小、更快 [功能 #13517]
-
通过延迟
Proc
分配,改进了使用块参数传递块的性能 [功能 #14045] -
为
TracePoint
钩子使用动态检测,而不是使用“trace”指令来避免开销 [功能 #14104] -
ERB 生成模板代码的速度是 Ruby 2.4 的两倍
其他更改¶ ↑
-
如果 $stderr 未更改且是 tty,则反向打印回溯和错误消息。[功能 #8661] [实验性]
-
如果 $stderr 未更改且是 tty,则以粗体/带下划线的文本打印错误消息。[功能 #14140] [实验性]
-
configure 选项 –with-ext 现在强制其参数。 例如,如果您运行 ./configure –with-ext=openssl,+,则保证编译 openssl 库,否则构建会异常失败。
但是,请始终在参数末尾添加“,+”。 否则,除了 openssl 之外,不会构建任何内容。[功能 #13302]