NEWS for Ruby 2.5.0¶ ↑
本文件列出了版本之间用户可见的功能更改,不包括错误修复。
请注意,每个条目都非常简短,没有提供任何原因或参考信息。有关包含所有充分信息的完整更改列表,请参阅 ChangeLog 文件或 Redmine(例如 https://bugs.ruby-lang.org/issues/$FEATURE_OR_BUG_NUMBER
)
自 2.4.0 版本以来的更改¶ ↑
语言更改¶ ↑
-
已移除顶层常量查找。[Feature #11547]
-
rescue/else/ensure 允许在 do/end 块内使用。[Feature #12906]
-
字符串插值进行了改进。[功能 #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
选项以暗示文本模式。[Bug #13350] -
File#path
为使用 File::Constants::TMPFILE 选项打开的文件引发IOError
。[功能 #13568] -
File.stat
、File.exist?
和其他使用rb_stat()
的方法释放 GVL。[Bug #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
可能会引发错误消息“流已关闭”,但已细化为“流在另一个线程中已关闭”。新消息对用户更清晰。 [错误 #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]
-
-
-
-
Range#initialize 在使用 #<=> 比较开始和结束时不再隐藏异常并引发“范围的错误值”
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]
-
-
正则表达式/字符串:将 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]` 表示一个从第 2 行第 1 列到第 6 行第 4 列的 `if` 语句。`[:then, 1, 3, 2, 3, 8]` 表示一个从第 3 行第 2 列到第 3 行第 8 列的 `then` 子句。请注意,行号从 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
-
添加 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` 自动要求 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 中的“版本 2.1.0”部分。
-
-
Pathname
-
新方法
-
Pathname#glob [功能 #7360]
-
-
-
Psych
-
更新到 Psych 3.0.2。
-
将回退选项转换为关键字参数 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
-
使 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
-
RbConfig::LIMITS 被添加以提供 C 类型的限制。当加载 rbconfig/sizeof 时,它可用。
-
-
Ripper
-
Ripper::EXPR_BEG 等等,用于 Ripper#state。
-
新方法
-
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。
-
-
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::Ifaddr#vhid [功能 #13803]
-
-
ConditionVariable、Queue 和 SizedQueue 为了速度进行了重新实现。它们不再是
Struct
的子类。[功能 #13552]
标准库兼容性问题(不包括功能错误修复)¶ ↑
-
宝石化
-
将以下标准库提升为默认宝石。
-
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
-
已从标准库中移除。[功能 #10169]
-
-
Rubygems
-
已从标准库中移除“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]