Ruby 2.6.0 的 NEWS¶ ↑
本文档是版本之间所做的用户可见的功能更改列表,不包括错误修复。
请注意,每个条目都非常简短,没有提供背后的原因或参考信息。有关包含所有足够信息的更改完整列表,请参阅 ChangeLog 文件或 Redmine(例如 https://bugs.ruby-lang.org/issues/$FEATURE_OR_BUG_NUMBER
)
自 2.5.0 版本以来的更改¶ ↑
语言更改¶ ↑
-
$SAFE
现在是进程全局状态,可以再次设置为 0。[功能 #14250] -
Refinements 在传递块时生效。[功能 #14223]
-
Refinements 在 Kernel#public_send 时生效。[功能 #15326]
-
Refinements 在 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
- 新方法
-
添加了
Array#union
和Array#difference
实例方法。[功能 #14097]
-
- 修改的方法
-
Array#to_h
现在接受一个块,该块将元素映射到新的键/值对。[功能 #15143]
-
- 别名方法
-
Array#filter
是Array#select
的新别名。[功能 #13784] -
Array#filter!
是Array#select!
的新别名。[功能 #13784]
-
Binding
- 新方法
-
添加了
Binding#source_location
。[功能 #14230]此方法返回绑定的源位置,一个包含
__FILE__
和__LINE__
的 2 元素数组。传统上,相同的信息可以通过eval("[__FILE__, __LINE__]", binding)
检索,但我们计划更改此行为,以便Kernel#eval
忽略绑定的源位置 [Bug #4352]。因此,用户应使用此新引入的方法,而不是Kernel#eval
。
-
Dir
- 新方法
-
添加了
Dir#each_child
和Dir#children
实例方法。[功能 #13969]
-
Enumerable
- 新方法
-
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
- 新方法
-
Enumerator#+
返回一个枚举器对象,该对象迭代接收器的元素,然后迭代另一个操作数的元素。[功能 #15144]
-
ENV
- 修改的方法
-
ENV.to_h
现在接受一个块,该块将名称和值映射到新的键和值。[功能 #15143]
-
Exception
- 新选项
-
Exception#full_message
接受:highlight
和:order
选项。[Bug #14324]
-
Hash
- 修改的方法
-
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
- 别名方法
-
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]
-
Method
Module
- 修改的方法
-
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
- 不兼容的更改
-
Numeric#step
现在返回Enumerator::ArithmeticSequence
类的实例,而不是Enumerator
类的实例。
-
- OpenStruct
- 修改的方法
-
OpenStruct#to_h 现在接受一个块,该块将键和值映射到新的键和值。[功能 #15143]
-
Proc
Random
- 新方法
-
添加了
Random.bytes
。[功能 #4938]
-
Range
- 新方法
-
添加了
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
会将每个子字符串 yield 到块中。[特性 #4780]
-
-
结构体
- 修改的方法
-
Struct#to_h
现在接受一个块,该块将键和值映射到新的键和值。[特性 #15143]
-
- 别名方法
-
Struct#filter
是Struct#select
的新别名。[特性 #13784]
-
时间
- 新特性
-
Time.new
和Time#getlocal
接受时区对象以及 UTC 偏移字符串。Time#+
、Time#-
和 Time#succ 也保留时区。[特性 #14850]
-
TracePoint
- 新特性
-
支持 “script_compiled” 事件。[特性 #15287]
-
- 新方法
-
TracePoint#parameters
[特性 #14694] -
TracePoint#instruction_sequence
[特性 #15287] -
TracePoint#eval_script
[特性 #15287]
-
- 修改的方法
-
TracePoint#enable
接受新的关键字“target:”和“target_line:”。[特性 #15289]
-
Stdlib 更新(仅限未完成的更新)¶ ↑
- BigDecimal
-
更新到 1.4.0 版本。此版本包含多个兼容性问题,详细信息请参见下面的兼容性问题部分。
- 修改的方法
-
BigDecimal() 接受与 Float() 类似的新关键字“exception:”。
-
- 关于最近版本差异的说明
-
您应该了解 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
为 true,则会将计数器清零。如果stop
为 true,则禁用覆盖率测量。
-
- 新方法
-
Coverage.line_stub,这是一个简单的辅助函数,用于从给定的源代码创建行覆盖率的“存根”。
-
- CSV
-
升级到 3.0.2。这包括性能改进,尤其是在写入方面。写入速度大约快 2 倍。请参见 github.com/ruby/csv/blob/master/NEWS.md。
-
- ERB
- 新选项
-
将
:trim_mode
和:eoutvar
关键字参数添加到 ERB.new。现在,第一个参数之外的非关键字参数将被软弃用,并在 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
- 新选项
-
将
:write_timeout
关键字参数添加到 Net::HTTP.new。[特性 #13396]
-
- 新方法
-
添加 Net::HTTP#write_timeout 和 Net::HTTP#write_timeout=。[特性 #13396]
-
- 新常量
-
添加 Net::HTTPClientException 以弃用 Net::HTTPServerException,其名称具有误导性。[Bug #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
- 别名方法
-
Set#filter! 是 Set#select! 的新别名。[特性 #13784]
-
- URI
- 新常量
-
添加 URI::File 以处理文件 URI 方案。[特性 #14035]
-
兼容性问题(不包括功能错误修复)¶ ↑
Dir
-
带有
'\0'
分隔模式列表的Dir.glob
将被弃用,并且现在会发出警告。[特性 #14643]
-
文件
-
File.read
、File.binread
、File.write
、File.binwrite
、File.foreach
和File.readlines
即使路径以管道字符'|'
开头,也不会调用外部命令。[特性 #14245]
-
对象
-
Object#=~ 已弃用。[特性 #15231]
-
Stdlib 兼容性问题(不包括功能错误修复)¶ ↑
-
这些标准库已升级为默认 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
-
Pathname#read、Pathname#binread、Pathname#write、Pathname#binwrite、Pathname#each_line 和 Pathname#readlines 即使路径以管道字符
'|'
开头,也不会调用外部命令。这遵循 [特性 #14245]。
-
实现改进¶ ↑
-
加快了
Proc#call
的速度,因为我们不再需要关心$SAFE
。[特性 #14318]通过多次使用
Proc#call
的lc_fizzbuzz
基准测试,我们可以测量出 1.4 倍的改进。[Bug #10212] -
加快了 block.call 的速度,其中
block
是传递的块参数。[特性 #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]
-
为 pthreads 平台启用了
Thread
缓存(用于Thread.new
和Thread.start
)。[特性 #14757] -
对于具有 POSIX 定时器的平台,消除了定时器线程。[Misc #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