NEWS Ruby 2.3.0
本文档是除 bug 修复之外,在版本发布之间所做的用户可见功能更改的列表。
请注意,每个条目都非常简短,没有提供原因或参考信息。要获取包含所有足够信息的更改的完整列表,请参阅 ChangeLog 文件或 Redmine(例如 https://bugs.ruby-lang.org/issues/$FEATURE_OR_BUG_NUMBER)
自 2.2.0 版本以来的变更
语言更改
-
frozen-string-literal pragma
-
新 pragma,已实验性引入 frozen-string-literal。 [Feature #8976]
-
此外,还引入了 –enable/–disable=frozen-string-literal 选项。 [Feature #8976]
-
命令行选项 –debug 或 –debug=frozen-string-literal 可启用附加的调试模式,该模式在出现冻结对象错误时 (
RuntimeError) 显示创建位置。 [Feature #11725]
-
-
安全导航运算符
-
新的方法调用语法,‘object&.foo’,如果 ‘object’ 不是 nil,则调用 ‘object’ 上的方法 foo。 [Feature #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。 [Feature #9098]
-
核心类更新(仅列出重要的更新)
-
-
ARGF.read_nonblock支持 ‘exception: false’,类似于IO#read_nonblock。 [Feature #11358]
-
-
-
Array#bsearch_index[Feature #10730] -
Array#dig[Feature #11643]
-
-
-
Comparable#==不再救援异常 [Feature #7688]
-
-
-
新的 Encoding::IBM037 (别名 ebcdic-cp-us; dummy)
-
-
-
添加了
Enumerable#grep_v作为Enumerable#grep的反向版本。 [Feature #11049] -
Enumerable#chunk_while[Feature #10769]
-
-
-
Enumerator::Lazy#grep_v[Feature #11773]
-
-
-
File.mkfifo[Feature #11536] -
添加 File::TMPFILE 对应 O_TMPFILE
-
-
-
Hash#fetch_values[Feature #10017] -
Hash#dig[Feature #11643] -
Hash#to_proc[Feature #11653]
-
-
-
新的模式标志 File::SHARE_DELETE 可用。此标志表示允许在 Windows 上删除已打开的文件,但目前仅影响以二进制方式打开的文件。 [Feature #11218]
-
添加了新的选项参数 ‘flags’。此参数与正常模式参数生成的 oflags 进行按位或运算。 [Feature #11253]
-
IO#advise不再在构建时检测到但在运行时不可用的情况下引发 Errno::ENOSYS。 [Feature #11806]
-
-
-
Kernel#loop,当被StopIteration异常中断时,将返回枚举器返回的值而不是 nil。 [Feature #11498]
-
-
Module
-
Module#deprecate_constant[Feature #11398]
-
-
-
添加了
NameError#receiver以获取接收器对象。 [Feature #10881]
-
-
-
添加了
Numeric#positive?和Numeric#negative?,它们分别在接收器为正数和负数时返回 true。 [Feature #11151]
-
-
-
Proc#call(以及 []、===、yield)已得到优化。回溯不再显示每个方法(直接显示块行)。TracePoint也忽略这些调用。 [Feature #11569]
-
-
Queue (
Thread::Queue)-
添加了 Queue#close 以通知终止。 [Feature #10600]
-
-
Regexp/String:Unicode 版本从 7.0.0 更新到 8.0.0
-
-
作为 iseq 加载器的基本工具添加了以下方法。请参阅 sample/iseq_loader.rb 的用法。请注意,加载器没有验证器,因此很容易通过加载修改/损坏的二进制数据导致严重问题。有关更多详细信息,请参阅 [Feature #11788]。 (实验性功能)
-
-
-
String.new现在接受新的选项参数 ‘encoding’。 [Feature #11785]
-
-
Struct#dig[Feature #11688]
-
-
-
添加了
Thread#name,Thread#name=以处理线程名称 [Feature #11251]
-
核心类的兼容性问题(不包括功能 bug 修复)
-
-
Array#select!,Array#keep_if,Array#reject!, 和Array#delete_if不再每次调用块时立即更改接收器数组。 [Feature #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
-
Module#define_method和Object.define_singleton_method现在需要方法体、Proc、Method 或块,并且在未直接提供块时引发ArgumentError。 [Bug #11283]
-
-
pack/unpack (Array/String)
-
j 和 J 指令用于指针宽度整数类型。 [Feature #11215]
-
标准库更新(仅列出重要的更新)
-
Logger
-
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`。 [Feature #10532]
-
-
-
Pathname#descend和Pathname#ascend支持无块形式。 [Feature #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异常。 [Feature #10532] [Feature #11229] -
BasicSocket#recv和BasicSocket#recv_nonblock允许输出String缓冲区参数,类似于IO#read和IO#read_nonblock,以减少GC开销。 [Feature #11242]
-
-
-
在只读模式下,
StringIO#set_encoding不再设置其缓冲区字符串的编码。现在,不通过StringIO#set_encoding直接设置字符串的编码可能会导致不可预测的行为。 [Bug #11827]
-
-
timeout
-
调用 Object#timeout 现在被警告为已弃用。
-
标准库兼容性问题(不包括功能 bug 修复)
-
-
Coverage.peek_result:新方法,允许在不停止覆盖工具的情况下捕获覆盖信息。 [Feature #10816]
-
-
Fiddle
-
Fiddle::Function#call 释放 GVL。 [Feature #11607]
-
-
io-console
-
更新到 io-console 0.4.5,并将许可证更改为 BSD 2-clause “Simplified” License。
-
-
lib/base64.rb
-
Base64.urlsafe_encode64:添加了 “padding” 选项以抑制填充字符 (“=”)。 [Feature #10740]
-
Base64.urlsafe_decode64:现在它不仅接受正确填充的输入,还接受未填充的输入。 [Feature #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
-
Connections 现在默认处于被动模式。默认模式可以通过 Net::FTP.default_passive= 更改。 [Feature #11612]
-
-
-
Net::HTTP#open_timeout的默认值现在是 60 (以前是 nil)。
-
-
Net::Telnet
-
Net::Telnet 已提取到 net-telnet gem。这是一个未维护的代码。 [Feature #11083]
-
-
-
更新到
Psych2.0.17
-
-
Rake
-
Rake 已从 stdlib 中移除。 [Feature #11025]
-
-
RDoc
-
更新到 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。 [Feature #5455]
-
C API 更新
-
rb_define_class_id_under() 在类已定义但其超类与给定超类不匹配时,会引发
TypeError异常,这与 ruby 级别的定义相同。 -
添加了 rb_timespec_now() 以将当前日期时间获取为 struct timespec。 [Feature #11558]
-
添加了 rb_time_timespec_new() 以使用 epoch、纳秒和 UTC/localtime/time 偏移参数创建时间对象。 [Feature #11558]
-
rb_autoload() 已弃用,请改用 rb_funcall()。 [Feature #11664]
-
rb_compile_error_with_enc(), rb_compile_error(), 和 rb_compile_bug() 已弃用。这些函数仅供内部使用。外部库不应使用它们。
支持的平台变更
-
不再支持 OS/2
-
不再支持 BeOS
-
不再支持 Borland-C
-
Haiku 现在稳定且尽力支持
实现改进
-
优化
Proc#call以消除方法帧的构造。 [Feature #11569] -
重新考虑方法入口数据结构。 [Bug #11278]
-
为方法表等使用的 ID 键表引入新的表数据结构。新表结构比 st_table 更简单、更快。 [Feature #11420]
-
对象分配和方法调用代码的机器代码级别调优。r52099, r52254
-
RubyVM::InstructionSequence已扩展以备未来改进。 [Feature #11788] -
Case 分派现在已针对包括 nil、true 和 false 在内的所有特殊常量字面量进行了优化。以前,只有字面量字符串、符号、整数和浮点数编译为优化的 case 分派。 [Feature #11769]
-
非纯 Ruby 类(T_DATA, T_FILE 等)上的实例变量的存储比以前更便宜。 [Feature #11170]
-
所有对大型
Struct对象成员的访问都以恒定时间执行。以前,超过前 10 个元素的Struct元素使用线性扫描。 [Feature #10585] -
Set 类获得了多项加速。 [Misc #10754], [r52591]
-
Socket和 I/O 相关改进-
大多数使用新关键字的 I/O 方法的调用开销
- Feature #11229
-
通过避免低效的 C API 来降低
解析关键字。 [Feature #11339]
-
标准库已更新为使用 [Feature #11229] 中改进的免异常非阻塞 I/O。除了减少昂贵的异常外,这还带来了更安静的 $DEBUG 输出。 [Feature #11044]
-
(仅限 Linux) 在标准库的任何地方等待单个 FD 不再使用 select(2),使其不受高编号 FD 减慢的影响。 [Feature #11081] [Feature #11377]
-
-
CGI.escapeHTML已通过 C 扩展进行优化。 github.com/ruby/ruby/pull/1164