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