NEWS for Ruby 2.3.0¶ ↑
本文件列出了版本之间用户可见的功能更改,不包括错误修复。
请注意,每个条目都非常简短,没有提供任何原因或参考信息。有关所有足够信息的完整更改列表,请参阅 ChangeLog 文件或 Redmine(例如 https://bugs.ruby-lang.org/issues/$FEATURE_OR_BUG_NUMBER
)
自 2.2.0 版本以来的更改¶ ↑
语言更改¶ ↑
-
冻结字符串字面量 pragma
-
新的 pragma,frozen-string-literal 已被实验性地引入。[特性 #8976]
-
此外,还引入了 –enable/–disable=frozen-string-literal 选项。[特性 #8976]
-
命令行选项 –debug 或 –debug=frozen-string-literal 启用额外的调试模式,该模式显示在冻结对象错误 (
RuntimeError
) 时创建的位置。[特性 #11725]
-
-
安全导航运算符
-
新的方法调用语法,‘object&.foo’,如果 ‘object’ 不为 nil,则在 ‘object’ 上调用方法 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 document
-
新的字符串字面量,here document 以 ‘<<~’ 开头。有关更多详细信息,请参阅 doc/syntax/literals.rdoc。[特性 #9098]
-
核心类更新(仅突出显示的更新)¶ ↑
-
-
ARGF.read_nonblock
支持 ‘exception: false’,类似于IO#read_nonblock
。[特性 #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] -
添加 File::TMPFILE,对应于 O_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]
-
-
队列 (
Thread::Queue
)-
添加了 Queue#close 来通知终止。[功能 #10600]
-
-
正则表达式/字符串: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 可能会导致不可预测的行为。[错误 #11827]
-
-
timeout
-
调用 Object#timeout 时,现在会发出弃用警告。
-
标准库兼容性问题(不包括特性错误修复)¶ ↑
-
ext/coverage/coverage.c
-
Coverage.peek_result:新方法,允许在不停止覆盖工具的情况下捕获覆盖率。[特性 #10816]
-
-
Fiddle
-
Fiddle::Function#call 释放 GVL。[特性 #11607]
-
-
io-console
-
更新到 io-console 0.4.5,并将许可证更改为 BSD 2-clause “Simplified” 许可证。
-
-
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 已从 stdlib 中删除。 [功能 #11025]
-
-
-
更新到
RDoc
4.2.1。 有关完整的发行说明,请参阅github.com/rdoc/rdoc/blob/master/History.rdoc#421–2015-12-22
-
-
RubyGems
-
更新到 RubyGems 2.5.1。 有关完整的发行说明,请参阅
docs.seattlerb.org/rubygems/History_txt.html#label-2.5.0+-2F+2015-11-03 和 docs.seattlerb.org/rubygems/History_txt.html#label-2.5.1+-2F+2015-12-10
-
内置全局变量兼容性问题¶ ↑
-
$SAFE
-
$SAFE=2 和 $SAFE=3 已过时。 如果 $SAFE 设置为 2 或更大,则会引发
ArgumentError
。 [功能 #5455]
-
C API 更新¶ ↑
-
rb_define_class_id_under() 现在在类已定义但其超类与给定超类不匹配时,以及在 ruby 级别定义时,都会引发
TypeError
异常。 -
rb_timespec_now() 已添加以获取当前日期时间作为 struct timespec。 [功能 #11558]
-
rb_time_timespec_new() 已添加以使用纪元、纳秒和 UTC/本地时间/时间偏移参数创建时间对象。 [功能 #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] -
重新考虑方法条目数据结构。 [错误 #11278]
-
为方法表等使用的 ID 键表引入新的表数据结构。 新的表结构比 st_table 简单且快速。 [功能 #11420]
-
对象分配和方法调用代码的机器码级别调整。 r52099、r52254
-
RubyVM::InstructionSequence
已扩展以供将来改进。 [功能 #11788] -
现在针对所有特殊常量字面量(包括 nil、true 和 false)优化了 case 分派。以前,只有字面量字符串、符号、整数和浮点数编译为优化的 case 分派。[功能 #11769]
-
非纯 Ruby 类(T_DATA、T_FILE 等)上的实例变量比以前存储起来更便宜。[功能 #11170]
-
对大型
Struct
对象的成员的所有访问都在恒定时间内完成。以前,Struct
元素超过前 10 个元素使用线性扫描。[功能 #10585] -
Set 类获得了几个加速。[杂项 #10754],[r52591]
-
套接字和 I/O 相关改进
-
大多数使用关键字的新 I/O 方法的调用开销
- 功能 #11229
-
通过避免低效的 C API 来减少
解析关键字。[功能 #11339]
-
标准库已更新为使用来自 [功能 #11229] 的改进的无异常非阻塞 I/O。这除了减少昂贵的异常之外,还有助于使 $DEBUG 输出更安静。[功能 #11044]
-
(仅限 Linux)在 stdlib 中的任何地方等待单个 FD 不再使用 select(2),使其不受高编号 FD 导致的减速的影响。[功能 #11081] [功能 #11377]
-
-
CGI.escapeHTML 使用 C 扩展进行优化。 github.com/ruby/ruby/pull/1164