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]
-
else
没有rescue
现在会导致语法错误。[实验性] [特性 #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
忽略绑定的源位置 [Bug #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
- 新方法
-
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
标志)。[Misc #14907]
-
KeyError
- 新选项
-
KeyError.new
接受:receiver
和:key
选项,以便在 Ruby 代码中设置接收者和键。[Feature #14313]
-
Method
Module
- 修改后的方法
-
Module#method_defined?
、Module#private_method_defined?
和Module#protected_method_defined?
现在接受第二个参数作为可选参数。如果为true
(默认值),则检查祖先模块/类,或仅检查类本身。[Feature #14944]
-
NameError
- 新选项
-
NameError.new
接受:receiver
选项,以便在 Ruby 代码中设置接收者。[Feature #14313]
-
NilClass
- 新方法
-
添加了 NilClass#=~ 以实现兼容性。[Feature #15231]
-
NoMethodError
- 新选项
-
NoMethodError.new
接受:receiver
选项,以便在 Ruby 代码中设置接收者。[Feature #14313]
-
Numeric
- 不兼容的更改
-
Numeric#step
现在返回Enumerator::ArithmeticSequence
类的实例,而不是Enumerator
类的实例。
-
- OpenStruct
- 修改方法
-
OpenStruct#to_h 现在接受一个块,该块将键和值映射到新的键和值。[Feature #15143]
-
Proc
Random
- 新方法
-
添加了
Random.bytes
。[Feature #4938]
-
Range
- 新方法
-
添加了
Range#%
实例方法。[Feature #14697]
-
- 不兼容的更改
-
Range#===
现在使用#cover?
而不是#include?
方法。[Feature #14575] -
Range#cover?
现在接受Range
对象。[Feature #14473] -
Range#step
现在返回Enumerator::ArithmeticSequence
类的实例,而不是Enumerator
类的实例。
-
- Regexp/String
-
将 Unicode 版本从 10.0.0 更新到 11.0.0。[Feature #14802]
这包括对 grapheme cluster (/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() 接受新的关键字“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
- 新选项
-
将
: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
-
速度提升约两倍。
-
使用 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.glob
使用'\0'
分隔的模式列表将被弃用,现在会发出警告。[功能 #14643]
-
File
-
File.read
、File.binread
、File.write
、File.binwrite
、File.foreach
和File.readlines
即使路径以管道字符'|'
开头也不会调用外部命令。[功能 #14245]
-
Object
-
Object#=~ 已被弃用。[功能 #15231]
-
标准库兼容性问题(不包括功能错误修复)¶ ↑
-
这些标准库已升级为默认 gem。
-
e2mmap
-
可转发
-
irb
-
日志记录器
-
矩阵
-
互斥锁
-
ostruct
-
素数
-
rexml
-
rss
-
shell
-
同步
-
thwait
-
跟踪器
-
- 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]。
-
实现改进¶ ↑
-
加速
Proc#call
,因为我们不再需要关心$SAFE
。[功能 #14318]使用
Proc#call
多次调用的lc_fizzbuzz
基准测试可以测量出 1.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 创建的进程的兼容性 [错误 #14867]
-
-
VM 生成器脚本更新;使生成的 VM 更加优化。[GH-1779]
-
Thread
缓存已为 pthreads 平台启用(用于Thread.new
和Thread.start
)。[功能 #14757] -
对于支持 POSIX 定时器的平台,已消除计时器线程。[杂项 #14937]
-
支持瞬态堆 (theap)。[错误 #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