Ruby 2.3.0 的 NEWS¶ ↑
本文档列出了版本之间用户可见的功能更改,不包括错误修复。
请注意,每个条目都非常简短,不提供任何原因或参考信息。有关包含所有足够信息的完整更改列表,请参阅 ChangeLog 文件或 Redmine(例如 https://bugs.ruby-lang.org/issues/$FEATURE_OR_BUG_NUMBER
)。
自 2.2.0 版本以来的更改¶ ↑
语言更改¶ ↑
-
frozen-string-literal 编译指示
-
新的编译指示 frozen-string-literal 已被实验性引入。[功能 #8976]
-
此外,还引入了 –enable/–disable=frozen-string-literal 选项。[功能 #8976]
-
命令行选项 –debug 或 –debug=frozen-string-literal 启用额外的调试模式,该模式在冻结对象错误(
RuntimeError
)时显示创建位置。[功能 #11725]
-
-
安全导航运算符
-
新的方法调用语法 ‘object&.foo’,如果 ‘object’ 不为 nil,则在其上调用方法 foo。[功能 #11537]
这类似于 Active Support 中的 ‘try!’,但
-
方法名称在语法上是必需的
obj.try! {} # valid obj&. {} # syntax error
-
仅在进行调用时才评估参数
obj.try!(:foo, bar()) # bar() is always evaluated obj&.foo(bar()) # bar() is conditionally evaluated
-
属性赋值是有效的
obj&.attr += 1
-
-
-
did_you_mean gem
-
当由于名称中的拼写错误而发生
NameError
或NoMethodError
时,did_you_mean gem 会自动建议其他与方法名称相似的名称。"Yuki".starts_with?("Y") # => NoMethodError: undefined method `starts_with?' for "Yuki":String # Did you mean? start_with?
-
-
缩进的 here 文档
-
新的字符串字面量,here 文档以 ‘<<~’ 开头。有关更多详细信息,请参阅 doc/syntax/literals.rdoc。[功能 #9098]
-
核心类更新(仅列出重要的)¶ ↑
-
-
ARGF.read_nonblock
支持像IO#read_nonblock
一样的 ‘exception: false’。[功能 #11358]
-
-
-
Array#bsearch_index
[功能 #10730] -
Array#dig
[功能 #11643]
-
-
-
Comparable#==
不再捕获异常 [功能 #7688]
-
-
-
新的 Encoding::IBM037 (别名 ebcdic-cp-us;虚拟)
-
-
-
添加了
Enumerable#grep_v
作为Enumerable#grep
的反向版本。[功能 #11049] -
Enumerable#chunk_while
[功能 #10769]
-
-
-
Enumerator::Lazy#grep_v
[功能 #11773]
-
-
-
File.mkfifo
[功能 #11536] -
添加与 O_TMPFILE 对应的 File::TMPFILE
-
-
-
Hash#fetch_values
[功能 #10017] -
Hash#dig
[功能 #11643] -
Hash#<=, Hash#<, Hash#>=, Hash#> [功能 #10984]
-
Hash#to_proc
[功能 #11653]
-
-
-
新的模式标志 File::SHARE_DELETE 可用。此标志表示允许删除 Windows 上打开的文件,但目前仅影响以二进制形式打开的文件。[功能 #11218]
-
添加了新的选项参数 ‘flags’。此参数按位或到由普通模式参数生成的 oflags。[功能 #11253]
-
如果
IO#advise
在构建时检测到但在运行时不可用,则不再引发 Errno::ENOSYS。[功能 #11806]
-
-
-
Kernel#loop
在被StopIteration
异常停止时,会返回枚举器返回的内容而不是 nil。[功能 #11498]
-
-
-
Module#deprecate_constant
[功能 #11398]
-
-
-
添加了
NameError#receiver
来获取接收器对象。[功能 #10881]
-
-
-
添加了
Numeric#positive?
和Numeric#negative?
,当接收器分别为正数和负数时,它们返回 true。[功能 #11151]
-
-
-
优化了
Proc#call
(以及 []、===、yield)。回溯不显示每个方法(直接显示块行)。TracePoint
也忽略这些调用。[功能 #11569]
-
-
Queue (
Thread::Queue
)-
添加了 Queue#close 来通知终止。[功能 #10600]
-
-
Regexp/String: 将 Unicode 版本从 7.0.0 更新到 8.0.0
-
-
添加以下方法作为 iseq 加载器的原始工具。有关用法,请参阅 sample/iseq_loader.rb。请注意,加载器没有验证器,因此很容易通过加载修改/损坏的二进制数据导致严重问题。有关更多详细信息,请参阅 [功能 #11788]。(实验性功能)
-
-
-
String.new
现在接受新的选项参数 ‘encoding’。[功能 #11785]
-
-
Struct#dig
[功能 #11688]
-
-
-
添加了
Thread#name
和Thread#name=
来处理线程名称 [功能 #11251]
-
核心类兼容性问题(不包括功能错误修复)¶ ↑
-
-
Array#select!
、Array#keep_if
、Array#reject!
和Array#delete_if
不再每次调用块时立即更改接收器数组。[功能 #10714] -
Array#flatten
和Array#flatten!
不再尝试调用给定级别之外的元素的 to_ary 方法。[错误 #10748] -
即使
Array#inspect
的内容返回与作为检查结果的Encoding.default_external
不兼容的字符串,也不会引发错误。[功能 #11801]
-
-
-
Enumerable#chunk
和Enumerable#slice_before
不再接受 initial_state 参数。[功能 #10958] 请改用局部变量来维护状态。
-
-
-
在 Windows 上,
File::Stat#ino
始终返回 0,但现在返回 BY_HANDLE_FILE_INFORMATION.nFileIndexHigh/Low。[功能 #11216]
-
-
-
即使
Hash#inspect
的内容返回与作为检查结果的Encoding.default_external
不兼容的字符串,也不会引发错误。[功能 #11801]
-
-
-
当转换发生时,
IO#each_codepoint
在 EOF 之前的不完整字符处引发异常。[错误 #11444]
-
-
Module#define_method
和Object.define_singleton_method
现在需要方法体、Proc
、Method
或一个块,如果没有直接给出块,则会引发ArgumentError
。[错误 #11283]
-
-
pack/unpack (Array/String)
-
指针宽度整数类型的 j 和 J 指令。[功能 #11215]
-
标准库更新(仅列出重要的)¶ ↑
-
Logger
-
Logger#level= 现在支持符号和字符串级别,例如 :debug、:info、:warn、:error、:fatal(不区分大小写)[功能 #11695]
-
添加了 Logger#reopen 来重新打开日志设备。[功能 #11696]
-
-
io/wait
-
IO#wait_readable
不再检查 FIONREAD,它可用于非字节流IO
,例如监听套接字。
-
-
Net::FTP
-
添加了 Net::FTP#mlst。
-
添加了 Net::FTP#mlsd。
-
-
nkf
-
合并 nkf 2.1.4。
-
-
ObjectSpace
(objspace)-
添加了 ObjectSpace.count_symbols。
-
添加了 ObjectSpace.count_imemo_objects。
-
添加了 ObjectSpace.internal_class_of。
-
添加了 ObjectSpace.internal_super_of。
-
-
OpenSSL
-
OpenSSL::SSL::SSLSocket#accept_nonblock 和 OpenSSL::SSL::SSLSocket#connect_nonblock 支持 ‘exception: false`。[功能 #10532]
-
-
Pathname
-
Pathname#descend 和 Pathname#ascend 支持无块形式。[特性 #11052]
-
-
套接字 (Socket)
-
Socket#connect_nonblock, Socket#accept_nonblock, TCPServer#accept_nonblock, UNIXServer#accept_nonblock, BasicSocket#recv_nonblock, BasicSocket#recvmsg_nonblock, BasicSocket#sendmsg_nonblock 都支持 `exception: false`,以返回 :wait_readable 或 :wait_writable 符号,而不是抛出
IO::WaitReadable
或IO::WaitWritable
异常。[特性 #10532] [特性 #11229] -
BasicSocket#recv 和 BasicSocket#recv_nonblock 允许像
IO#read
和IO#read_nonblock
一样使用输出String
缓冲区参数,以减少GC
开销。[特性 #11242]
-
-
StringIO
-
在只读模式下,StringIO#set_encoding 不再设置其缓冲区字符串的编码。直接在不使用 StringIO#set_encoding 的情况下设置字符串的编码可能会导致不可预测的行为。[Bug #11827]
-
-
超时 (timeout)
-
当调用 Object#timeout 时,现在会发出已弃用的警告。
-
标准库兼容性问题(不包括功能性 Bug 修复)¶ ↑
-
ext/coverage/coverage.c
-
Coverage.peek_result:新的方法,允许在不停止覆盖率工具的情况下捕获覆盖率。[特性 #10816]
-
-
Fiddle
-
Fiddle::Function#call 释放 GVL。[特性 #11607]
-
-
io-console
-
更新到 io-console 0.4.5,并将许可证更改为 BSD 2-clause “简化”许可证。
-
-
lib/base64.rb
-
Base64.urlsafe_encode64:添加了一个 “padding” 选项来抑制填充字符(“=”)。[特性 #10740]
-
Base64.urlsafe_decode64:现在它不仅接受正确填充的输入,还接受未填充的输入。[特性 #10740]
-
-
lib/drb/drb.rb
-
移除了未使用的参数。github.com/ruby/ruby/pull/515
-
-
lib/matrix.rb
-
添加 Vector#round。github.com/ruby/ruby/pull/802
-
-
lib/webrick/utils.rb
-
移除了未使用的参数。github.com/ruby/ruby/pull/356
-
-
Net::FTP
-
现在默认情况下连接处于被动模式。默认模式可以通过 Net::FTP.default_passive= 来更改。[特性 #11612]
-
-
Net::HTTP
-
Net::HTTP#open_timeout 的默认值现在是 60(之前是 nil)。
-
-
Net::Telnet
-
Net::Telnet 被提取到 net-telnet gem 中。它是无法维护的代码。[特性 #11083]
-
-
Psych
-
更新到 Psych 2.0.17
-
-
Rake
-
Rake 已从标准库中移除。[特性 #11025]
-
-
-
更新到
RDoc
4.2.1。完整的发行说明请参阅github.com/rdoc/rdoc/blob/master/History.rdoc#421–2015-12-22
-
-
RubyGems
内置全局变量兼容性问题¶ ↑
-
$SAFE
-
$SAFE=2 和 $SAFE=3 已过时。如果 $SAFE 设置为 2 或更大,则会引发
ArgumentError
。[特性 #5455]
-
C API 更新¶ ↑
-
rb_define_class_id_under() 现在会在类已经定义但其超类与给定的超类不匹配时引发
TypeError
异常,以及在 Ruby 级别定义时。 -
添加了 rb_timespec_now() 来获取当前日期时间,类型为 struct timespec。[特性 #11558]
-
添加了 rb_time_timespec_new() 来创建带有 epoch、纳秒和 UTC/localtime/time 偏移量参数的时间对象。[特性 #11558]
-
rb_autoload() 已弃用,请改用 rb_funcall()。[特性 #11664]
-
rb_compile_error_with_enc()、rb_compile_error() 和 rb_compile_bug() 已弃用。这些函数已公开,但仅供内部使用。外部库不应使用它们。
支持的平台更改¶ ↑
-
不再支持 OS/2
-
不再支持 BeOS
-
不再支持 Borland-C
-
Haiku 现在稳定且尽力而为
实现改进¶ ↑
-
优化
Proc#call
以消除方法帧的构建。[特性 #11569] -
重新考虑方法条目数据结构。[Bug #11278]
-
为方法表等使用的 ID 键表引入新的表数据结构。新的表结构比 st_table 更简单、更快。[特性 #11420]
-
对象分配和方法调用代码的机器代码级调整。r52099, r52254
-
扩展
RubyVM::InstructionSequence
以供未来改进。[特性 #11788] -
现在针对所有特殊常量字面量(包括 nil、true 和 false)优化了 Case 分发。以前,只有字面量字符串、符号、整数和浮点数被编译为优化的 Case 分发。[特性 #11769]
-
非纯 Ruby 类 (T_DATA, T_FILE 等) 上的实例变量存储成本低于以前。[特性 #11170]
-
对大的
Struct
对象的所有成员的访问都在恒定时间内执行。以前,超过前 10 个元素的Struct
元素使用线性扫描。[特性 #10585] -
Set 类获得了一些加速。[Misc #10754], [r52591]
-
套接字和 I/O 相关改进
-
大多数使用新关键字的 I/O 方法的调用开销在
- 特性 #11229
-
通过避免低效的 C API 来减少
来解析关键字。[特性 #11339]
-
标准库已更新为使用 [特性 #11229] 中改进的无异常非阻塞 I/O。除了减少昂贵的异常外,这还具有更安静的 $DEBUG 输出的额外好处。[特性 #11044]
-
(仅限 Linux)在标准库中的任何地方等待单个 FD 不再使用 select(2),使其不受高编号 FD 的减速影响。[特性 #11081] [特性 #11377]
-
-
CGI.escapeHTML 使用 C 扩展进行了优化。github.com/ruby/ruby/pull/1164