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 代码块中使用。[特性 #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
选项来暗示文本模式。[错误 #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
可能会抛出错误消息“流已关闭”,但它被细化为“流在另一个线程中关闭”。新消息对用户更清晰。[错误 #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
当给定一个无法与 > 比较的步长值时,不再隐藏来自 coerce 方法的错误。[功能 #7688] -
数值比较运算符 (<,<=,>=,>) 不再内部隐藏来自 coerce 方法的异常。如果强制转换不可能,则在 coerce 中返回 nil。[功能 #7688]
-
-
-
如果存在 getrusage(2),则
Process.times
的精度得到提高。[功能 #11952] -
新方法
-
Process.last_status
作为 $? 的别名。[功能 #14043]
-
-
-
-
Range#initialize 在使用 <=> 比较 begin 和 end 时不再隐藏异常,并引发“范围的错误值”
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
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]` 表示一个从第 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]` 表示 `Object#foo` 的范围从第 1 行第 0 列到第 7 行第 3 列。上面的例子表明这个 `Object#foo` 被调用了两次。
注意:为了保持兼容性,不向 `Coverage.start` 传递任何选项将只测量行覆盖率,`Coverage.result` 将返回旧格式。
Coverage.result #=> { "/path/to/file.rb"=> [1, 2, 0, nil, ...] }
-
-
-
添加
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]
-
-
-
以相反的顺序打印回溯和错误消息 [功能 #8661] [实验性]
-
`binding.irb` 自动要求 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 中的“版本 2.1.0”部分。
-
-
-
新方法
-
Pathname#glob
[功能 #7360]
-
-
-
-
更新到
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::LIMITS 以提供 C 类型的限制。这在加载 rbconfig/sizeof 时可用。
-
-
-
Ripper::EXPR_BEG 等用于 Ripper#state。
-
新方法
-
Ripper#state 用于告知扫描器的状态。[功能 #13686]
-
-
-
-
更新到
RDoc
6.0.1。-
-
这极大地提高了生成文档的速度。
-
它还有助于在将来支持新的语法。
-
支持过去几年中 Ruby 的许多新语法。
-
使用“frozen_string_literal: true”。性能调查:gist.github.com/aycabta/abdfaa75ea8a6877eeb734e942e73800
-
支持 did_you_mean。
-
-
-
Rubygems
-
更新到 Rubygems 2.7.3。
-
-
-
新方法
-
SecureRandom.alphanumeric
-
-
-
-
StringIO#write
接受多个参数
-
-
-
新方法
-
-
-
相对路径操作不再将连续的斜杠折叠为单个斜杠。[错误 #8352]
-
-
WEBrick
-
添加服务器名称指示 (SNI) 支持 [功能 #13729]
-
支持
Proc
对象作为主体响应 [功能 #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 化
-
将以下标准库提升为默认 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
。[错误 #9569] -
互斥锁重写为更小更快 [功能 #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]