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] -
flip-flop 语法已弃用。[特性 #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
忽略绑定的源位置 [错误 #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
选项。[错误 #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
类的实例。
-
- Regexp/String
-
将 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
-
String#crypt
现在已弃用。[特性 #14915]
- 新特性
-
如果给定块,
String#split
会将每个子字符串传递给该块。[特性 #4780]
-
-
Struct
- 修改的方法
-
Struct#to_h
现在接受一个块,该块将键和值映射为新的键和值。[特性 #15143]
-
- 别名方法
-
Struct#filter
是Struct#select
的新别名。[特性 #13784]
-
Time
- 新特性
-
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]
-
标准库更新(仅限未完成的)¶ ↑
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,其名称具有误导性。[缺陷 #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
兼容性问题(不包括特性错误修复)¶ ↑
Dir
-
使用
'\0'
分隔的模式列表的Dir.glob
将被弃用,现在会发出警告。[特性 #14643]
-
File
-
File.read
、File.binread
、File.write
、File.binwrite
、File.foreach
和File.readlines
即使路径以管道字符'|'
开头,也不会调用外部命令。[特性 #14245]
-
Object
-
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
-
Pathname#read
、Pathname#binread
、Pathname#write
、Pathname#binwrite
、Pathname#each_line
和Pathname#readlines
即使路径以管道字符'|'
开头,也不会调用外部命令。这遵循 [特性 #14245]。
-
实现改进¶ ↑
-
加速
Proc#call
,因为我们不再需要关心$SAFE
。[特性 #14318]使用多次使用
Proc#call
的lc_fizzbuzz
基准测试,我们可以测量到 x1.4 的改进。[缺陷 #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
)。[Feature #14757] -
对于具有 POSIX 定时器的平台,定时器线程被消除。[Misc #14937]
-
支持瞬态堆 (theap)。[Bug #14858] [Feature #14989]
theap 是一个用于短期内存对象的托管堆。例如,创建一个小型的、短期的
Hash
对象的速度快了 2 倍。通过 rdoc 基准测试,我们测量到 6-7% 的性能提升。 -
协程的本机实现(arm32、arm64、ppc64le、win32、win64、x86、amd64)显著提高了
Fiber
的性能。[Feature #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