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] -
添加与 O_TMPFILE 相对应的 File::TMPFILE
-
-
-
Hash#fetch_values
[特性 #10017] -
Hash#dig
[特性 #11643] -
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 方法。[Bug #10748] -
Array#inspect
即使其内容返回的字符串与Encoding.default_external
不兼容,也不会引发错误。[Feature #11801]
-
-
-
Enumerable#chunk
和Enumerable#slice_before
不再接受 initial_state 参数。[Feature #10958] 使用局部变量来维护状态。
-
-
-
在 Windows 上,
File::Stat#ino
始终返回 0,但现在返回 BY_HANDLE_FILE_INFORMATION.nFileIndexHigh/Low。[Feature #11216]
-
-
-
Hash#inspect
即使其内容返回的字符串与Encoding.default_external
不兼容,也不会引发错误。[Feature #11801]
-
-
-
IO#each_codepoint
在转换发生时,在 EOF 之前的不完整字符处引发异常。[Bug #11444]
-
-
Module#define_method
和Object.define_singleton_method
现在需要方法体、Proc
、Method
或代码块,如果直接没有给出代码块,则会引发ArgumentError
。[Bug #11283]
-
-
pack/unpack (Array/String)
-
j 和 J 指令用于指针宽度整数类型。[Feature #11215]
-
标准库更新(仅突出显示的更新)¶ ↑
-
-
Logger#level=
现在支持符号和字符串级别,例如 :debug、:info、:warn、:error、:fatal(不区分大小写)。[Feature #11695] -
Logger#reopen
已添加以重新打开日志设备。[Feature #11696]
-
-
io/wait
-
IO#wait_readable
不再检查 FIONREAD,它可用于非字节流IO
,例如监听套接字。
-
-
Net::FTP
-
添加了 Net::FTP#mlst。
-
添加了 Net::FTP#mlsd。
-
-
nkf
-
合并 nkf 2.1.4。
-
-
ObjectSpace
(objspace) -
-
OpenSSL::SSL::SSLSocket#accept_nonblock
和OpenSSL::SSL::SSLSocket#connect_nonblock
支持 ‘exception: false`。[功能 #10532]
-
-
-
Pathname#descend
和Pathname#ascend
支持无块形式。[功能 #11052]
-
-
-
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#set_encoding
不再设置其缓冲区字符串的编码。现在,在没有StringIO#set_encoding
的情况下直接设置字符串的编码可能会导致不可预测的行为。[错误 #11827]
-
-
timeout
-
调用 Object#timeout 时,现在会发出弃用警告。
-
标准库兼容性问题(不包括功能错误修复)¶ ↑
-
ext/coverage/coverage.c
-
Coverage.peek_result
: 新方法允许在不停止覆盖工具的情况下捕获覆盖率。[功能 #10816]
-
-
-
Fiddle::Function#call
释放 GVL。[特性 #11607]
-
-
io-console
-
更新到 io-console 0.4.5,并将许可证更改为 BSD 2-clause “简化” 许可证。
-
-
lib/base64.rb
-
Base64.urlsafe_encode64
: 添加了“填充”选项以抑制填充字符(“=”)。[特性 #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#open_timeout
的默认值现在为 60(以前为 nil)。
-
-
Net::Telnet
-
Net::Telnet 已提取到 net-telnet gem 中。它是不可维护的代码。[特性 #11083]
-
-
-
更新到
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() 现在在类已定义但其超类与给定超类不匹配时引发
TypeError
异常,以及 ruby 级别中的定义。 -
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] -
重新考虑方法入口数据结构。[Bug #11278]
-
引入新的表格数据结构,用于方法表等使用的 ID 键表。新的表格结构比 st_table 更简单、更快。[功能 #11420]
-
机器码级别调整,用于对象分配和方法调用代码。r52099, r52254
-
RubyVM::InstructionSequence
扩展以进行未来改进。[功能 #11788] -
案例分派现在针对所有特殊常量字面量(包括 nil、true 和 false)进行了优化。以前,只有字面量字符串、符号、整数和浮点数编译为优化的案例分派。[功能 #11769]
-
非纯 Ruby 类(T_DATA、T_FILE 等)上的实例变量比以前存储起来更便宜。[功能 #11170]
-
对大型
Struct
对象成员的所有访问都在恒定时间内完成。以前,Struct
元素超过前 10 个元素使用线性扫描。[功能 #10585] -
Set
类获得了几个加速。[杂项 #10754],[r52591] -
Socket
和 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