NEWS for Ruby 2.6.0¶ ↑
本文件列出了版本之间用户可见的功能变更,不包括错误修复。
请注意,每个条目都非常简短,没有提供任何原因或参考信息。有关所有充分信息的完整更改列表,请参阅 ChangeLog 文件或 Redmine(例如:https://bugs.ruby-lang.org/issues/$FEATURE_OR_BUG_NUMBER
)。
自 2.5.0 版本以来的更改¶ ↑
语言更改¶ ↑
-
$SAFE
现在是进程全局状态,可以再次设置为 0。[功能 #14250] -
细化发生在块传递时。[功能 #14223]
-
细化发生在 Kernel#public_send 时。[功能 #15326]
-
细化发生在 Kernel#respond_to? 时。[功能 #15327]
-
没有
rescue
的else
现在会导致语法错误。[实验性] [功能 #14606] -
常量名称可以以非 ASCII 大写字母开头。[功能 #13770]
-
引入了无限范围。您可以使用没有结束的
Range
,例如(0..)
(或类似的(0...)
)。[功能 #12912]以下显示了典型用例
ary[1..] # identical to ary[1..-1] (1...).each {|index| block } # infinite loop from index 1 ary.zip(1..) {|elem, index| block } # ary.each.with_index(1) { }
-
关键字参数哈希中的非符号键会导致异常。
-
已删除“遮蔽外部局部变量”警告。[功能 #12490]
您现在可以编写以下内容而不会收到警告
user = users.find {|user| cond(user) }
-
如果异常未被捕获并打印了其回溯和错误消息,则打印异常的
cause
。[功能 #8257] -
翻转语法已弃用。[功能 #5400]
核心类更新(仅突出显示)¶ ↑
数组
- 新方法
-
添加了
Array#union
和Array#difference
实例方法。[功能 #14097]
-
- 修改方法
-
Array#to_h
现在接受一个块,该块将元素映射到新的键/值对。[功能 #15143]
-
- 别名方法
-
Array#filter
是Array#select
的新别名。[功能 #13784] -
Array#filter!
是Array#select!
的新别名。[功能 #13784]
-
绑定
- 新方法
-
添加了
Binding#source_location
。[功能 #14230]此方法返回绑定的源位置,一个包含
__FILE__
和__LINE__
的 2 元素数组。传统上,可以通过eval("[__FILE__, __LINE__]", binding)
获取相同的信息,但我们计划更改此行为,以便Kernel#eval
忽略绑定的源位置 [错误 #4352]。因此,用户应该使用这个新引入的方法,而不是Kernel#eval
。
-
目录
- 新方法
-
添加了
Dir#each_child
和Dir#children
实例方法。[功能 #13969]
-
可枚举
- 新方法
-
Enumerable#chain
返回一个枚举器对象,它依次遍历接收者的元素,然后遍历每个参数的元素。[特性 #15144]
-
- 修改方法
-
Enumerable#to_h
现在接受一个块,该块将元素映射到新的键值对。[特性 #15143]
-
- 别名方法
-
Enumerable#filter
是Enumerable#select
的新别名。[特性 #13784]
-
Enumerator::ArithmeticSequence
-
这是一个新类,用于表示算术序列的生成器,即由公差定义的数字序列。它可以用来表示类似于 Python 的切片。你可以从
Numeric#step
和Range#step
获取此类的实例。
-
Enumerator::Chain
-
这是一个新类,用于表示可枚举对象的链,它作为一个单一的枚举器工作,由
Enumerable#chain
和Enumerator#+
等方法生成。
-
Enumerator::Lazy
- 别名方法
-
Enumerator::Lazy#filter
是Enumerator::Lazy#select
的新别名。[特性 #13784]
-
枚举器
- 新方法
-
Enumerator#+
返回一个枚举器对象,它遍历接收者的元素,然后遍历另一个操作数的元素。[特性 #15144]
-
ENV
- 修改方法
-
ENV.to_h
现在接受一个块,该块将名称和值映射到新的键和值。[特性 #15143]
-
异常
- 新选项
-
Exception#full_message
接受:highlight
和:order
选项。[错误 #14324]
-
哈希
- 修改后的方法
-
Hash#merge
、Hash#merge!
和Hash#update
现在接受多个参数。[特性 #15111] -
Hash#to_h
现在接受一个块,该块将键和值映射到新的键和值。[特性 #15143]
-
- 别名方法
-
Hash#filter
是Hash#select
的新别名。[特性 #13784] -
Hash#filter!
是Hash#select!
的新别名。[特性 #13784]
-
IO
- 新选项
-
添加了新的模式字符
'x'
用于以独占方式打开文件。[功能 #11258]
-
内核
- 别名方法
-
Kernel#then
是Kernel#yield_self
的新别名。[功能 #14594]
-
- 新选项
-
Kernel#Complex
、Kernel#Float
、Kernel#Integer
和Kernel#Rational
接受:exception
选项来指定错误处理方式。[功能 #12732] -
Kernel#system
接受:exception
选项,在失败时引发异常。[功能 #14386]
-
- 不兼容的更改
-
Kernel#system
和Kernel#exec
不再关闭非标准文件描述符(:close_others
选项的默认值已更改为false
,但我们仍然在创建的描述符上设置FD_CLOEXEC
标志)。[杂项 #14907]
-
KeyError
- 新选项
-
KeyError.new
接受:receiver
和:key
选项,用于在 Ruby 代码中设置接收者和键。[功能 #14313]
-
方法
模块
- 修改后的方法
-
Module#method_defined?
、Module#private_method_defined?
和Module#protected_method_defined?
现在接受第二个参数作为可选参数。如果它是true
(默认值),它将检查祖先模块/类,或者只检查类本身。[功能 #14944]
-
NameError
- 新选项
-
NameError.new
接受:receiver
选项,用于在 Ruby 代码中设置接收者。[功能 #14313]
-
NilClass
- 新方法
-
NilClass#=~
已添加以确保兼容性。[功能 #15231]
-
NoMethodError
- 新选项
-
NoMethodError.new
接受:receiver
选项,用于在 Ruby 代码中设置接收者。[功能 #14313]
-
数值
- 不兼容的更改
-
Numeric#step
现在返回Enumerator::ArithmeticSequence
类的实例,而不是Enumerator
类的实例。
-
OpenStruct
- 修改方法
-
OpenStruct#to_h
现在接受一个块,该块将键和值映射到新的键和值。[功能 #15143]
-
Proc
随机数
- 新方法
-
添加了
Random.bytes
。[功能 #4938]
-
范围
- 新方法
-
添加了
Range#%
实例方法。[功能 #14697]
-
- 不兼容的更改
-
Range#===
现在使用#cover?
方法而不是#include?
方法。[特性 #14575] -
Range#cover?
现在接受Range
对象。[特性 #14473] -
Range#step
现在返回Enumerator::ArithmeticSequence
类的一个实例,而不是Enumerator
类的一个实例。
-
- 正则表达式/字符串
-
将 Unicode 版本从 10.0.0 更新到 11.0.0。[特性 #14802]
这包括对音节群 (/X/) 算法的重写,以及对
String#downcase
上的格鲁吉亚 MTAVRULI 的特殊情况处理。 -
将 Emoji 版本从 5.0 更新到 11.0.0 [特性 #14802]
-
RubyVM::AbstractSyntaxTree
- 新方法
-
RubyVM::AbstractSyntaxTree.parse
解析给定的字符串并返回 AST 节点。[实验性] -
RubyVM::AbstractSyntaxTree.parse_file
解析给定的文件并返回 AST 节点。[实验性] -
RubyVM::AbstractSyntaxTree.of
返回给定 proc 或方法的 AST 节点。[实验性]
-
RubyVM
- 新方法
-
RubyVM.resolve_feature_path 识别将由“require(feature)”加载的文件。[实验性] [特性 #15230]
-
字符串
-
String#crypt
现在已弃用。[特性 #14915]
- 新特性
-
String#split
如果给出,则将每个子字符串传递给块。[特性 #4780]
-
-
结构
- 修改方法
-
Struct#to_h
现在接受一个块,该块将键和值映射到新的键和值。[特性 #15143]
-
- 别名方法
-
Struct#filter
是Struct#select
的新别名。[特性 #13784]
-
时间
- 新特性
-
Time.new
和Time#getlocal
接受时区对象以及 UTC 偏移字符串。Time#+
,Time#-
和 Time#succ 也保留时区。[特性 #14850]
-
跟踪点
- 新特性
-
支持“script_compiled” 事件。[特性 #15287]
-
- 新方法
-
TracePoint#parameters
[特性 #14694] -
TracePoint#instruction_sequence
[特性 #15287] -
TracePoint#eval_script
[特性 #15287]
-
- 修改方法
-
TracePoint#enable
接受新的关键字“target:” 和 “target_line:”。 [特性 #15289]
-
标准库更新(仅突出显示)¶ ↑
BigDecimal
-
更新至 1.4.0 版本。此版本包含一些兼容性问题,有关详细信息,请参阅下面的兼容性问题部分。
- 修改方法
-
BigDecimal() 接受新的关键字“exception:”,类似于 Float()。
-
- 关于最近版本差异的说明
-
您可能需要了解 bigdecimal 最近版本的差异。请根据以下信息选择合适的 bigdecimal 版本。
-
1.3.5 有
BigDecimal.new
,没有“exception:”关键字。当您指定“-w”选项时,您会看到BigDecimal.new
的弃用警告。BigDecimal()、BigDecimal.new
和 Object#to_d 方法相同。 -
1.4.0 有
BigDecimal.new
,带有“exception:”关键字。您始终会看到BigDecimal.new
的弃用警告。Object#to_d 方法与 BigDecimal() 和BigDecimal.new
不同。 -
2.0.0 将在 Ruby 2.6.0 发布后不久发布。此版本将不再有
BigDecimal.new
方法。
-
Bundler
-
将
Bundler
添加到标准库。 [特性 #12733] -
使用 1.17.2,最新稳定版本。
-
Coverage
-
添加了一个 oneshot_lines 模式。 [特性 #15022]
此模式检查“每行是否至少执行一次”,而不是“每行执行了多少次”。每行的钩子最多触发一次,触发后钩子标志将被移除,即它以零开销运行。
- 新选项
-
将
:oneshot_lines
关键字参数添加到Coverage.start
。 -
将
:stop
和:clear
关键字参数添加到Coverage.result
。如果clear
为真,它会将计数器清零。如果stop
为真,它会禁用覆盖率测量。
-
- 新方法
-
Coverage.line_stub
,这是一个简单的辅助函数,它根据给定的源代码创建行覆盖率的“存根”。
-
CSV
-
升级到 3.0.2。这包括性能改进,特别是对于写入。写入速度提高了约 2 倍。请参阅 github.com/ruby/csv/blob/master/NEWS.md。
-
ERB
- 新选项
-
在
ERB.new
中添加了:trim_mode
和:eoutvar
关键字参数。现在,除了第一个参数之外的非关键字参数已软弃用,将在 Ruby 2.5 成为 EOL 时删除。[功能 #14256] -
erb 命令的
-S
选项已弃用,将在下一个版本中删除。
-
FileUtils
- 新方法
-
FileUtils#cp_lr
。[功能 #4189]
-
- Matrix
- 新方法
-
Matrix#antisymmetric?, Matrix#skew_symmetric?
-
Matrix#map!, Matrix#collect! [功能 #14151]
-
Matrix#[]=
-
Vector#map!, Vector#collect!
-
Vector#[]=
-
Net
- 新选项
-
在
Net::HTTP.new
中添加了:write_timeout
关键字参数。[功能 #13396]
-
- 新方法
-
添加
Net::HTTP#write_timeout
和Net::HTTP#write_timeout=
。[功能 #13396]
-
- 新常量
-
添加
Net::HTTPClientException
以弃用 Net::HTTPServerException,其名称具有误导性。[错误 #14688]
-
NKF
-
升级到 nkf v2.1.5
-
Psych
-
升级到
Psych
3.1.0
-
RDoc
-
速度提高了约 2 倍。
-
使用 SOURCE_DATE_EPOCH 生成文件。
-
修复了滑落的行号。
-
启用
--width
、--exclude
和--line-numbers
,这些选项以前被忽略。 -
在默认标记符号中添加对“>>>”引用的支持。
-
在 TomDoc 符号中添加对“Raises”行的支持。
-
修复语法错误输出。
-
修复了许多解析错误。
-
- REXML
-
升级到 REXML 3.1.9。请参阅 github.com/ruby/rexml/blob/master/NEWS.md。
- 改进了一些 XPath 实现
-
concat()
函数:在连接之前将所有参数转换为字符串。 -
string()
函数:支持上下文节点。 -
string()
函数:支持处理指令节点。 -
在 XPath 2.0 中支持
"*:#{ELEMENT_NAME}"
语法。
-
- 修复了一些 XPath 实现
-
"//#{ELEMENT_NAME}[#{POSITION}]"
情况 -
string()
函数:修复function(document)
返回超出根元素的节点。 -
"/ #{ELEMENT_NAME} "
情况 -
"/ #{ELEMENT_NAME} [ #{PREDICATE} ]"
情况 -
"/ #{AXIS}::#{ELEMENT_NAME}"
情况 -
"#{N}-#{M}"
情况:在"-"
之前需要一个或多个空格 -
"/child::node()"
情况 -
"#{FUNCTION}()/#{PATH}"
情况 -
"@#{ATTRIBUTE}/parent::"
情况 -
"name(#{NODE_SET})"
情况
-
-
- RSS
- 新选项
-
RSS::Parser.parse 现在接受
Hash
作为选项。:validate
、:ignore_unknown_element
、:parser_class
选项可用。
-
- RubyGems
集合
- 别名方法
-
Set#filter!
是Set#select!
的新别名。[特性 #13784]
-
URI
兼容性问题(不包括特性错误修复)¶ ↑
目录
-
Dir.glob
使用'\0'
分隔的模式列表将被弃用,现在会发出警告。[特性 #14643]
-
文件
-
File.read
、File.binread
、File.write
、File.binwrite
、File.foreach
和File.readlines
即使路径以管道字符'|'
开头,也不会调用外部命令。[特性 #14245]
-
对象
-
Object#=~ 已被弃用。[特性 #15231]
-
标准库兼容性问题(不包括特性错误修复)¶ ↑
-
这些标准库已被提升为默认 gem。
-
e2mmap
-
forwardable
-
irb
-
logger
-
matrix
-
mutex_m
-
ostruct
-
prime
-
rexml
-
rss
-
shell
-
sync
-
thwait
-
tracer
-
BigDecimal
-
以下方法已删除。
-
BigDecimal.allocate
-
BigDecimal.ver
-
-
每个
BigDecimal
对象都被冻结。[特性 #13984] -
BigDecimal() 解析给定字符串,类似于 Float()。
-
String#to_d
解析接收器字符串,类似于String#to_f
。 -
BigDecimal.new
将在 2.0 版本中删除。
-
路径名
-
Pathname#read
、Pathname#binread
、Pathname#write
、Pathname#binwrite
、Pathname#each_line
和Pathname#readlines
即使路径以管道字符'|'
开头,也不会调用外部命令。这遵循 [特性 #14245]。
-
实现改进¶ ↑
-
由于不再需要关心
$SAFE
,因此加速了Proc#call
。[功能 #14318]使用
Proc#call
多次的lc_fizzbuzz
基准测试可以测量出1.4倍的性能提升。[Bug #10212] -
加速
block
是传递块参数的block.call
。[功能 #14330]Ruby 2.5 提高了块传递性能。[功能 #14045]
此外,Ruby 2.6 提高了传递块调用的性能。
-
引入了 JIT(即时)编译器的初始实现。[功能 #14235] [实验性]
-
添加了
--jit
命令行选项以启用 JIT。--jit-verbose=1
适用于检查。有关其他选项,请参阅ruby --help
。 -
为了生成机器代码,此 JIT 编译器使用用于构建解释器的 C 编译器。目前,GCC、Clang 和 Microsoft Visual C++ 支持它。
-
添加了
--disable-mjit-support
选项以进行配置。这是为 JIT 调试添加的,但如果您在构建 JIT 的头文件时遇到错误,可以使用此选项跳过构建它作为解决方法。 -
在类 Unix 平台上重新实现了 rb_waitpid,以保持与为 JIT 创建的进程的兼容性 [Bug #14867]
-
-
VM 生成器脚本更新;使生成的 VM 更加优化。[GH-1779]
-
Thread
缓存已为 pthreads 平台启用(用于Thread.new
和Thread.start
)。[功能 #14757] -
对于具有 POSIX 定时器的平台,已消除计时器线程。[杂项 #14937]
-
支持瞬时堆 (theap)。[Bug #14858] [功能 #14989]
theap 是一个用于短生命周期内存对象的托管堆。例如,创建一个小而短生命周期的
Hash
对象的速度快 2 倍。使用 rdoc 基准测试,我们测得性能提升了 6-7%。 -
协程的原生实现(arm32、arm64、ppc64le、win32、win64、x86、amd64)显着提高了
Fiber
的性能。[功能 #14739]
其他更改¶ ↑
-
在 macOS 上,共享库不再在其名称中包含 Ruby 的完整版本号。这消除了用户需要重建每个微小升级的平台上的负担,从而重建每个扩展库。
- 之前
-
libruby.2.6.0.dylib
-
libruby.2.6.dylib -> libruby.2.6.0.dylib
-
libruby.dylib -> libruby.2.6.0.dylib
-
- 之后
-
libruby.2.6.dylib
-
libruby.dylib -> libruby.2.6.dylib
-
-
将 misc/*.el 文件提取到 github.com/ruby/elisp