Ruby 2.5.0 的 NEWS¶ ↑
本文档列出了版本之间用户可见的功能变更,不包括错误修复。
请注意,每个条目都非常简短,没有提供任何背后的原因或参考信息。有关所有充分信息的完整变更列表,请参阅 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
变为 public。[特性 #14132] -
Module#define_method
、Module#alias_method
、Module#undef_method
和Module#remove_method
变为 public。[特性 #14133]
-
-
-
当给定一个无法与 > 0 比较的步长值时,
Numeric#step
不再隐藏来自 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。
-
支持新的 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
1.3.4 -
添加了以下功能
-
BigDecimal::VERSION
-
-
以下功能已弃用,并计划在 1.4.0 版本中删除
-
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]` 读取从第 1 行第 0 列到第 7 行第 3 列的 `Object#foo`。以上示例显示此 `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
对象传递的局部变量渲染模板。[特性 #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?
[特性 #11666] -
IPAddr#link_local?
[特性 #10912]
-
-
IRB
-
反向打印回溯和错误消息 [特性 #8661] [实验性]
-
`binding.irb` 自动 require irb 并运行 [Bug #13099] [实验性]
-
`binding.irb` 在启动时显示调用它的行周围的源代码 [特性 #14124]
-
-
Matrix
-
新方法
-
Matrix.combine 和 Matrix#combine [特性 #10903]
-
Matrix#hadamard_product 和 Matrix#entrywise_product
-
-
-
-
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 环境变量。[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
[特性 #7360]
-
-
-
-
更新到
Psych
3.0.2。-
将 fallback 选项转换为关键字参数 github.com/ruby/psych/pull/342
-
像
JSON.parse
一样,向Psych.load
,Psych.safe_load
添加 :symbolize_names 选项 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::LIMITS 以提供 C 类型的限制。这在加载 rbconfig/sizeof 时可用。
-
-
-
Ripper#state 的 Ripper::EXPR_BEG 等。
-
新方法
-
Ripper#state 用于告知扫描器的状态。[特性 #13686]
-
-
-
-
更新到
RDoc
6.0.1。-
用
Ripper
替换基于 IRB 的词法分析器。-
这大大提高了生成文档的速度。
-
它还有助于支持未来的新语法。
-
支持过去几年中 Ruby 的许多新语法。
-
使用 “frozen_string_literal: true”。性能调查:gist.github.com/aycabta/abdfaa75ea8a6877eeb734e942e73800
-
支持 did_you_mean。
-
-
-
Rubygems
-
更新到 Rubygems 2.7.3。
-
-
-
StringIO#write
接受多个参数
-
-
-
新方法
-
-
-
相对路径操作不再将连续斜杠折叠为单个斜杠。[Bug #8352]
-
-
WEBrick
-
添加服务器名称指示 (SNI) 支持 [特性 #13729]
-
支持
Proc
对象作为 body 响应 [特性 #855] -
作为 RubyGem 发布 [特性 #13173]
-
避免来自
Kernel#open
的意外行为 [杂项 #14216]
-
-
-
Zlib::GzipWriter#write
接受多个参数
-
兼容性问题(不包括功能错误修复)¶ ↑
-
-
BasicSocket#read_nonblock
和BasicSocket#write_nonblock
不再将 O_NONBLOCK 文件描述符标志设置为副作用(仅在 Linux 上)[特性 #13362]
-
-
-
Random.raw_seed 被重命名为
Random.urandom
。由于 [Bug #9569],它现在适用于非播种目的。
-
-
-
添加了
Socket::Ifaddr#vhid
[特性 #13803]
-
-
为了提高速度,重新实现了 ConditionVariable、Queue 和 SizedQueue。它们不再是
Struct
的子类。[特性 #13552]
标准库兼容性问题(不包括功能错误修复)¶ ↑
-
宝石化
-
将以下标准库提升为默认 gem。
-
cmath
-
csv
-
date
-
dbm
-
etc
-
fcntl
-
fiddle
-
fileutils
-
gdbm
-
ipaddr
-
scanf
-
sdbm
-
stringio
-
strscan
-
webrick
-
zlib
-
-
-
-
Logger.new
("| command") 曾经意外地打开一个命令。这是被禁止的,现在 Logger#initialize 仅将String
参数视为文件名,就像它的规范一样。[Bug #14212]
-
-
-
Net::HTTP#start
现在默认将 :ENV 传递给 p_addr。[Bug #13351] 要避免这种情况,请显式传递 nil。
-
-
mathn.rb
-
从标准库中删除。[特性 #10169]
-
-
Rubygems
-
从标准库中删除了“ubygems.rb”文件。自从 Ruby 1.9 以来,它是不需要的。
-
支持的平台更改¶ ↑
-
删除对 NaCl 平台的支持
实现改进¶ ↑
-
(这可能不是“用户可见的功能更改”,但是)
Hash
类的哈希函数现在是 SipHash13。[特性 #13017] -
SecureRandom
现在更倾向于使用操作系统提供的来源,而不是OpenSSL
。[Bug #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]