NEWS for Ruby 2.7.0

本文档是除 bug 修复之外,在版本发布之间所做的用户可见功能更改的列表。

请注意,每个条目都保持得非常简短,不提供原因或参考信息。要查看所有信息的完整更改列表,请参阅 ChangeLog 文件或 Redmine (例如 https://bugs.ruby-lang.org/issues/$FEATURE_OR_BUG_NUMBER)。

自 2.6.0 发布以来的更改

语言更改

模式匹配

关键字参数的规范已为 3.0 进行了更改

编号参数

没有块的 proc/lambda 已弃用

其他杂项更改

命令行选项

Warning 选项

-W 选项已扩展为后面带有 :,用于管理分类警告。[Feature #16345] [Feature #16420]

另请参阅 Core classes updates 中的 Warning

核心类更新(仅列出重要的更新)

Array
新方法
Comparable
修改的方法
  • Comparable#clamp 现在接受 Range 参数。[Feature #14784]

    -1.clamp(0..2) #=> 0
     1.clamp(0..2) #=> 1
     3.clamp(0..2) #=> 2
    # With beginless and endless ranges:
    -1.clamp(0..)  #=> 0
     3.clamp(..2)  #=> 2
    
Complex
新方法
Dir
修改的方法
  • Dir.globDir.[] 不再允许 NUL 分隔的 glob 模式。请改用 Array。[Feature #14643]

Encoding
新编码
  • 添加了新编码 CESU-8。[Feature #15931]

Enumerable
新方法
  • 添加了 Enumerable#filter_map。[Feature #15323]

    [1, 2, 3].filter_map {|x| x.odd? ? x.to_s : nil } #=> ["1", "3"]
    
  • 添加了 Enumerable#tally。[Feature #11076]

    ["A", "B", "C", "B", "A"].tally #=> {"A"=>2, "B"=>2, "C"=>1}
    
Enumerator
新方法
  • 添加了 Enumerator.produce,用于从任何自定义数据转换生成 Enumerator。[Feature #14781]

    require "date"
    dates = Enumerator.produce(Date.today, &:succ) #=> infinite sequence of dates
    dates.detect(&:tuesday?) #=> next Tuesday
    
  • 添加了 Enumerator::Lazy#eager,用于从惰性枚举器(lazy enumerator)生成一个非惰性枚举器。[Feature #15901]

    a = %w(foo bar baz)
    e = a.lazy.map {|x| x.upcase }.map {|x| x + "!" }.eager
    p e.class               #=> Enumerator
    p e.map {|x| x + "?" }  #=> ["FOO!?", "BAR!?", "BAZ!?"]
    
  • 添加了 Enumerator::Yielder#to_proc,这样 Yielder 对象可以直接作为块参数传递给另一个方法。[Feature #15618]

  • 添加了 Enumerator::Lazy#with_index 以使其成为惰性。之前,Enumerator::Lazy#with_index 未定义,因此它会继承 Enumerator 的默认实现,而该实现不是惰性的。[Bug #7877]

    ("a"..).lazy.with_index(1) { |it, index| puts "#{index}:#{it}" }.take(3).force
    # => 1:a
    #    2:b
    #    3:c
    
Fiber
新方法
  • 添加了 Fiber#raise,其行为类似于 Fiber#resume,但在恢复的协程(fiber)上引发异常。[Feature #10344]

File
新方法
  • 添加了 File.absolute_path?,以便以可移植的方式检查路径是否为绝对路径。[Feature #15868]

    File.absolute_path?("/foo")   # => true (on *nix)
    File.absolute_path?("C:/foo") # => true (on Windows)
    File.absolute_path?("foo")    # => false
    
修改的方法
  • 在非 Windows 平台上,File.extname 现在对于以点结尾的名称返回一个点字符串。[Bug #15267]

    File.extname("foo.") #=> "."
    
FrozenError
新方法
GC
新方法
  • 添加了 `GC.compact` 方法来压缩堆。此函数压缩堆中的活动对象,以便使用更少的页面,并且堆更易于进行 CoW(写时复制)。[Feature #15626]

    有关算法和注意事项的详细信息,请访问:bugs.ruby-lang.org/issues/15626

IO
新方法
Integer
修改的方法
  • Integer#[] 现在支持范围操作。[Feature #8842]

    0b01001101[2, 4]  #=> 0b0011
    0b01001100[2..5]  #=> 0b0011
    0b01001100[2...6] #=> 0b0011
    #   ^^^^
    
Method
修改的方法
Module
新方法
  • 添加了 Module#const_source_location,用于检索常量定义的位置。[Feature #10771]

  • 添加了 Module#ruby2_keywords,用于将方法标记为通过常规参数拆包(argument splat)传递关键字参数,在将所有参数委托给另一个方法时非常有用,并且可以与旧版 Ruby 向后兼容。[Bug #16154]

修改的方法
NilClass / TrueClass / FalseClass
修改的方法
ObjectSpace::WeakMap
修改的方法
Proc
新方法
  • 添加了 Proc#ruby2_keywords,用于将 proc 标记为通过常规参数拆包(argument splat)传递关键字参数,在将所有参数委托给另一个方法或 proc 时非常有用,并且可以与旧版 Ruby 向后兼容。[Feature #16404]

Range
新方法
修改的方法
RubyVM
移除的方法
  • RubyVM.resolve_feature_path 已移动到 $LOAD_PATH.resolve_feature_path。[Feature #15903] [Feature #15230]

String
Unicode
  • 将 Unicode 版本和 Emoji 版本从 11.0.0 更新到 12.0.0。[Feature #15321]

  • 将 Unicode 版本更新到 12.1.0,增加了对 U+32FF SQUARE ERA NAME REIWA 的支持。[Feature #15195]

  • 将 Unicode Emoji 版本更新到 12.1。[Feature #16272]

Symbol
新方法
Time
新方法
修改的方法
UnboundMethod
新方法
  • 添加了 UnboundMethod#bind_call 方法。[Feature #15955]

    umethod.bind_call(obj, ...) 在语义上等同于 umethod.bind(obj).call(...)。这种习惯用法在一些库中用于调用被覆盖的方法。添加的方法在不分配中间 Method 对象的情况下完成相同的操作。

    class Foo
      def add_1(x)
        x + 1
      end
    end
    class Bar < Foo
      def add_1(x) # override
        x + 2
      end
    end
    
    obj = Bar.new
    p obj.add_1(1) #=> 3
    p Foo.instance_method(:add_1).bind(obj).call(1) #=> 2
    p Foo.instance_method(:add_1).bind_call(obj, 1) #=> 2
    
Warning
新方法
  • 添加了 Warning.[]Warning.[]= 来管理发出/抑制某些类别的警告。[Feature #16345] [Feature #16420]

$LOAD_PATH
新方法
  • 添加了 $LOAD_PATH.resolve_feature_path。[Feature #15903] [Feature #15230]

标准库更新(仅列出重要的更新)

Bundler
CGI
CSV
Date
Delegator
ERB
  • 禁止 marshaling ERB 实例。

IRB
  • 引入了受 Pry gem 启发的语法高亮,用于 Binding#irb 的源行、REPL 输入以及某些核心类对象的 inspect 输出。

  • 引入了由 Reline 提供的多行编辑模式。

  • 在补全时显示文档。

  • 默认启用自动缩进和历史记录的保存/加载。

JSON
  • 升级到 2.3.0。

Net::FTP
  • 添加了 `Net::FTP#features` 来检查可用功能,以及 `Net::FTP#option` 来启用/禁用每个功能。[Feature #15964]

Net::HTTP
  • Net::HTTP#start 添加了 `ipaddr` 可选参数,用于替换 TCP/IP 连接的地址。[Feature #5180]

Net::IMAP
  • 添加了服务器名称指示 (SNI) 支持。[Feature #15594]

open-uri
  • Kernel 中对 `open-uri` 的“open”方法发出警告。请改用 URI.open。[Misc #15893]

  • “text/*”媒体类型的默认字符集是 UTF-8,而不是 ISO-8859-1。[Bug #15933]

OptionParser
  • 现在会显示未知选项的“您是否指...”提示。[Feature #16256]

    test.rb

    require "optparse"
    OptionParser.new do |opts|
      opts.on("-f", "--foo", "foo") {|v| }
      opts.on("-b", "--bar", "bar") {|v| }
      opts.on("-c", "--baz", "baz") {|v| }
    end.parse!
    

    示例

    $ ruby test.rb --baa
    Traceback (most recent call last):
    test.rb:7:in `<main>': invalid option: --baa (OptionParser::InvalidOption)
    Did you mean?  baz
                   bar
Pathname
  • Pathname.glob 现在将 3 个参数委托给 Dir.glob 以接受 `base` 关键字参数。[Feature #14405]

Racc
  • 合并了上游存储库的 1.4.15 版本,并添加了 racc 的 cli。

Reline
  • 新的标准库,与 readline 标准库兼容,但用纯 Ruby 实现。它还提供多行编辑模式。

REXML
RSS
RubyGems
StringScanner

兼容性问题(不包括功能性 bug 修复)

Proc
  • Proc#to_s 的格式已更改。[Feature #16101]

Range
  • Range#minmax 以前会迭代范围来确定最大值。现在它使用与 Range#max 相同的算法。在极少数情况下(例如,Float 或 String 的范围),这可能会产生不同的结果。[Bug #15807]

标准库兼容性问题(不包括功能 bug 修复)

pathname
  • 当使用 Pathname 参数调用 Kernel#Pathname 时,它现在返回参数而不是创建一个新的 Pathname。这与其他 Kernel 方法更相似,但可能会破坏修改返回值并期望参数不被修改的代码。

profile.rb, Profiler__
  • 已从标准库中移除。它自 Ruby 2.0.0 起就无人维护。

C API 更新

实现改进

Fiber
  • 允许使用 --with-coroutine= 选择不同的协程实现,例如:

    $ ./configure --with-coroutine=ucontext
    $ ./configure --with-coroutine=copy
  • 用 fiber 池缓存替换了之前的堆栈缓存。fiber 池在一个内存区域中分配了许多堆栈。堆分配变为 O(log N),fiber 创建摊销为 O(1)。在微基准测试中测量到大约 10 倍的性能提升。github.com/ruby/ruby/pull/2224

File
  • 在许多平台上,File.realpath 使用 realpath(3),这可以显著提高性能。[Feature #15797]

Hash
  • 更改了小型 Hash 对象的内部数据结构。[Feature #15602]

Monitor
  • Monitor 类是用 C 扩展编写的。[Feature #16255]

Thread
  • VM 堆栈内存分配现在与原生线程堆栈合并,提高了线程分配性能并减少了与分配相关的失败。在微基准测试中测量到大约 10 倍的性能提升。

JIT
  • 当优化假设无效时,JIT 编译的代码会被重新编译为优化程度较低的代码。

  • 当一个方法被认为是纯粹(pure)的时,会执行方法内联。此优化仍是实验性的,许多方法尚未被视为纯粹。

  • --jit-max-cache 的默认值从 1,000 更改为 100。

  • --jit-min-calls 的默认值从 5 更改为 10,000。

RubyVM
  • 每个调用站点的​​方法缓存(自 1.9 版本左右以来一直存在)得到了改进:缓存命中率从 89% 提高到 94%。请参阅 github.com/ruby/ruby/pull/2583

RubyVM::InstructionSequence

杂项更改