NEWS for Ruby 2.7.0

此文件列出各版本間可見的使用者功能變更,但錯誤修正除外。

請注意,每個項目都簡短記載,沒有提供背後原因或參考資訊。如需完整變更清單,請參閱變更記錄檔案或 Redmine(例如:https://bugs.ruby-lang.org/issues/$FEATURE_OR_BUG_NUMBER)。

自 2.6.0 版本後變更

語言變更

模式比對

關鍵字參數規格已變更為 3.0

編號參數

不帶區塊的 proc/lambda 已過時

其他雜項變更

命令列選項

Warning 選項

-W 選項已擴充為後接一個 :,用於管理分類警告。[功能 #16345] [功能 #16420]

另請參閱 核心類別更新 中的 Warning

核心類別更新(僅未完成的)

陣列
新方法
可比較
已修改的方法
  • Comparable#clamp 現在接受 Range 引數。[功能 #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
    
複數
新方法
目錄
已修改的方法
  • Dir.globDir.[] 不再允許 NUL 分隔的 glob 模式。請改用 Array。[功能 #14643]

編碼
新增編碼
  • 新增編碼 CESU-8。[功能 #15931]

可列舉
新方法
  • 新增 Enumerable#filter_map。[功能 #15323]

    [1, 2, 3].filter_map {|x| x.odd? ? x.to_s : nil } #=> ["1", "3"]
    
  • 新增 Enumerable#tally。[功能 #11076]

    ["A", "B", "C", "B", "A"].tally #=> {"A"=>2, "B"=>2, "C"=>1}
    
列舉器
新方法
  • 新增 Enumerator.produce 以從任何自訂資料轉換產生 Enumerator。[功能 #14781]

    require "date"
    dates = Enumerator.produce(Date.today, &:succ) #=> infinite sequence of dates
    dates.detect(&:tuesday?) #=> next Tuesday
    
  • 新增 Enumerator::Lazy#eager,可從延遲列舉器產生非延遲列舉器。[功能 #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 物件可直接傳遞給其他方法作為區塊引數。[功能 #15618]

  • 新增 Enumerator::Lazy#with_index 以延遲處理。先前 Enumerator::Lazy#with_index 未定義,因此會採用 Enumerator 的預設實作,而該實作並非延遲處理。[錯誤 #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 上引發例外。[功能 #10344]

檔案
新方法
  • 新增 File.absolute_path? 以可攜式的方式檢查路徑是否為絕對路徑。[功能 #15868]

    File.absolute_path?("/foo")   # => true (on *nix)
    File.absolute_path?("C:/foo") # => true (on Windows)
    File.absolute_path?("foo")    # => false
    
已修改的方法
  • File.extname 現在會為以句點結尾的名稱傳回句點字串(非 Windows 平台)。[錯誤 #15267]

    File.extname("foo.") #=> "."
    
FrozenError
新方法
GC
新方法
  • 新增 GC.compact 方法以壓縮堆積。此函式會壓縮堆積中的動態物件,以便使用較少的頁面,且堆積可能更適合 CoW(寫入時複製)。[功能 #15626]

    演算法和注意事項的詳細資訊可在此處找到:bugs.ruby-lang.org/issues/15626

IO
新方法
整數
已修改的方法
  • Integer#[] 現在支援範圍運算。[功能 #8842]

    0b01001101[2, 4]  #=> 0b0011
    0b01001100[2..5]  #=> 0b0011
    0b01001100[2...6] #=> 0b0011
    #   ^^^^
    
方法
已修改的方法
模組
新方法
  • 新增 Module#const_source_location 以擷取常數定義的位置。[功能 #10771]

  • 新增 Module#ruby2_keywords 以標記方法透過常規引數 splat 傳遞關鍵字引數,這在將所有引數委派給其他方法時很有用,且可與舊版 Ruby 相容。[錯誤 #16154]

已修改的方法
NilClass / TrueClass / FalseClass
已修改的方法
ObjectSpace::WeakMap
已修改的方法
Proc
新方法
  • 新增 Proc#ruby2_keywords 以標記程序透過常規引數 splat 傳遞關鍵字引數,這在將所有引數委派給其他方法或程序時很有用,且可與舊版 Ruby 相容。[功能 #16404]

範圍
新方法
已修改的方法
RubyVM
移除方法
  • RubyVM.resolve_feature_path 已移至 $LOAD_PATH.resolve_feature_path。[功能 #15903] [功能 #15230]

字串
Unicode
  • 將 Unicode 版本和 Emoji 版本從 11.0.0 更新至 12.0.0。[功能 #15321]

  • 將 Unicode 版本更新至 12.1.0,新增支援 U+32FF 方塊時代名稱令和。[功能 #15195]

  • 將 Unicode Emoji 版本更新至 12.1。[功能 #16272]

符號
新方法
時間
新方法
已修改的方法
未繫結方法
新方法
  • 新增 UnboundMethod#bind_call 方法。[功能 #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.[]= 來管理發出/抑制某些類別的警告。[功能 #16345] [功能 #16420]

$LOAD_PATH
新方法
  • 新增 $LOAD_PATH.resolve_feature_path。[功能 #15903] [功能 #15230]

標準函式庫更新(僅有未完成的更新)

Bundler
CGI
CSV
日期
委派器
ERB
  • 禁止封送 ERB 執行個體。

IRB
  • 引入受 Pry 寶石啟發的語法高亮顯示至 Binding#irb 原始碼行、REPL 輸入和某些核心類別物件的檢查輸出。

  • 引入由 Reline 提供的多行編輯模式。

  • 完成時顯示文件。

  • 預設啟用自動縮排和儲存/載入記錄。

JSON
  • 升級至 2.3.0。

Net::FTP
  • 新增 Net::FTP#features 以檢查可用的功能,以及 Net::FTP#option 以啟用/停用每個功能。[功能 #15964]

Net::HTTP
  • 新增 ipaddr 選擇性參數至 Net::HTTP#start 以取代 TCP/IP 連線的位址。[功能 #5180]

Net::IMAP
  • 新增伺服器名稱指示 (SNI) 支援。[功能 #15594]

open-uri
  • 警告 Kernel 中 open-uri 的「open」方法。請改用 URI.open。[雜項 #15893]

  • 「text/*」媒體類型的預設字元集為 UTF-8,而非 ISO-8859-1。[錯誤 #15933]

OptionParser
  • 現在會針對未知選項顯示「您的意思是?」。[功能 #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
Racc
  • 合併上游儲存庫的 1.4.15,並新增 racc 的 cli。

Reline
  • 與 readline 標準函式庫相容的新標準函式庫,但以純 Ruby 實作。它也提供多行編輯模式。

REXML
RSS
RubyGems
StringScanner

相容性問題(不含功能錯誤修正)

Proc
  • Proc#to_s 格式已變更。[功能 #16101]

範圍
  • Range#minmax 用於反覆運算範圍以確定最大值。它現在使用與 Range#max 相同的演算法。在某些罕見情況下(例如浮點數或字串的範圍),這可能會產生不同的結果。[Bug #15807]

Stdlib 相容性問題(不包括功能錯誤修正)

pathname
  • Kernel#Pathname 在使用 Pathname 引數呼叫時,現在會傳回引數,而不是建立新的 Pathname。這與其他 Kernel 方法較為類似,但可能會中斷修改傳回值且預期不會修改引數的程式碼。

profile.rb、Profiler__
  • 已從標準函式庫中移除。自 Ruby 2.0.0 起,它就沒有維護了。

C API 更新

實作改進

Fiber
  • 允許使用 --with-coroutine= 選擇不同的協程實作,例如

    $ ./configure --with-coroutine=ucontext
    $ ./configure --with-coroutine=copy
  • 用纖維池快取取代先前的堆疊快取。纖維池在單一記憶體區域中配置許多堆疊。堆疊配置變成 O(log N),而纖維建立則攤銷為 O(1)。在微基準測試中,效能改善了約 10 倍。github.com/ruby/ruby/pull/2224

檔案
  • File.realpath 現在在許多平台上使用 realpath(3),這可以大幅改善效能。[功能 #15797]

雜湊
  • 變更小型 Hash 物件的資料結構。[功能 #15602]

監視器
  • Monitor 類別以 C 擴充套件撰寫。[功能 #16255]

執行緒
  • VM 堆疊記憶體配置現在與原生執行緒堆疊結合,改善執行緒配置效能並減少與配置相關的失敗。在微基準測試中,效能改善了約 10 倍。

JIT
  • 當最佳化假設失效時,JIT 編譯的程式碼會重新編譯為較不最佳化的程式碼。

  • 當方法被視為純粹時,會執行 Method 內嵌。這個最佳化仍然是實驗性的,而且許多方法尚未被視為純粹。

  • --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

其他變更