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]
-
MethodModule- 修改的方法
-
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]
-
ProcRandom- 新方法
-
添加了
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-
升级到
Psych3.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