NEWS for Ruby 3.0.0¶ ↑
此文件列出自 2.7.0 發行以來使用者可見的功能變更,但排除錯誤修正。
請注意,每個項目都簡化到最少,請參閱連結以取得詳細資訊。
語言變更¶ ↑
-
關鍵字參數現在與位置參數分開。在 Ruby 2.7 中會導致棄用警告的程式碼,現在會導致
ArgumentError
或不同的行為。[功能 #14183] -
接受單一 rest 參數和關鍵字的 Proc 不再受自動展開的影響。這現在與接受單一 rest 參數但不接受關鍵字的 Proc 的行為相符。[功能 #16166]
pr = proc{|*a, **kw| [a, kw]} pr.call([1]) # 2.7 => [[1], {}] # 3.0 => [[[1]], {}] pr.call([1, {a: 1}]) # 2.7 => [[1], {:a=>1}] # and deprecation warning # 3.0 => [[[1, {:a=>1}]], {}]
-
參數轉送 (
...
) 現在支援前導參數。[功能 #16378]def method_missing(meth, ...) send(:"do_#{meth}", ...) end
-
模式比對 (
case/in
) 不再是實驗性質。[功能 #17260] -
單行模式比對經過重新設計。[實驗性質]
-
新增尋找模式。[實驗性質] [功能 #16828]
case ["a", 1, "b", "c", 2, "d", "e", "f", 3] in [*pre, String => x, String => y, *post] p pre #=> ["a", 1] p x #=> "b" p y #=> "c" p post #=> [2, "d", "e", "f", 3] end
-
新增無限方法定義。[實驗性質] [功能 #16746]
def square(x) = x * x
-
當使用
# frozen-string-literal: true
時,內插的String
文字不再凍結。[功能 #17104] -
新增凍結常數的魔術註解
shareable_constant_value
。有關更多詳細資訊,請參閱 魔術註解。[功能 #17273] -
引進 靜態分析 基礎。
-
預設不再顯示棄用警告(自 Ruby 2.7.2 起)。使用
-W:deprecated
開啟它們(或使用-w
也顯示其他警告)。[功能 #16345] -
$SAFE
和$KCODE
現在是沒有特殊行為的普通全域變數。與$SAFE
相關的 C-API 方法已移除。[功能 #16131] [功能 #17136] -
方法中的單例類別定義中的 yield 現在是
SyntaxError
,而不是警告。方法外部的類別定義中的 yield 現在是SyntaxError
,而不是LocalJumpError
。[功能 #15575] -
當類別變數被祖先類別/模組中的相同定義取代時,現在會引發
RuntimeError
(以前,它只會在詳細模式下發出警告)。此外,從頂層範圍存取類別變數現在是RuntimeError
。[錯誤 #14541] -
指派給編號參數現在是
SyntaxError
,而不是警告。
命令列選項¶ ↑
--help
選項¶ ↑
當環境變數 RUBY_PAGER
或 PAGER
存在且有非空值,且標準輸入和輸出是 tty 時,--help
選項會透過該值指定的 pager 顯示說明訊息。[功能 #16754]
--backtrace-limit
選項¶ ↑
--backtrace-limit
選項限制 backtrace 的最大長度。[功能 #8661]
核心類別更新¶ ↑
僅限未解決的。
-
-
可使用
Enumerator::ArithmeticSequence
進行切片dirty_data = ['--', 'data1', '--', 'data2', '--', 'data3'] dirty_data[(1..).step(2)] # take each second element # => ["data1", "data2", "data3"]
-
-
當
Binding#eval
呼叫時,只有一個參數會在評估的程式碼中使用"(eval)"
作為__FILE__
和1
作為__LINE__
。 [錯誤 #4352] [錯誤 #17419]
-
-
條件變數
-
ConditionVariable#wait 現在可以在非封鎖環境中呼叫
block
/unblock
排程器掛鉤。 [功能 #16786]
-
-
-
已新增
ENV.except
,其會傳回一個雜湊,排除指定的鍵及其值。 [功能 #15822]
-
-
-
新增新的編碼 IBM720。 [功能 #16233]
-
已將
Encoding.default_external
的預設值變更為 Windows 上的 UTF-8 [功能 #16604]
-
-
-
Fiber#blocking?
會告知纖維是否為非封鎖。 [功能 #16786] -
Fiber#backtrace
和Fiber#backtrace_locations
提供每個纖維的追蹤。 [功能 #16815] -
已放寬
Fiber#transfer
的限制。 [錯誤 #17221]
-
-
已新增
GC.auto_compact=
和GC.auto_compact
來控制壓縮執行時間。將auto_compact=
設為true
會導致壓縮在主要收集期間發生。目前,壓縮會為主要收集增加大量的負擔,因此請先進行測試! [功能 #17176]
-
-
-
Hash#transform_keys
和Hash#transform_keys!
現在接受將鍵對應到新鍵的雜湊。 [功能 #16274] -
已新增
Hash#except
,其會傳回一個雜湊,排除指定的鍵及其值。 [功能 #15822]
-
-
-
IO#nonblock?
現在預設為true
。 [功能 #16786] -
IO#wait_readable
、IO#wait_writable
、IO#read
、IO#write
和其他相關方法(例如IO#puts
、IO#gets
)可能會在非封鎖執行內容中呼叫排程器掛鉤#io_wait(io, events, timeout)
。[功能 #16786]
-
-
-
當使用
freeze: false
關鍵字呼叫Kernel#clone
時,將使用freeze: false
關鍵字呼叫#initialize_clone
。[錯誤 #14266] -
當使用
freeze: true
關鍵字呼叫Kernel#clone
時,將使用freeze: true
關鍵字呼叫#initialize_clone
,即使接收器未凍結,也會傳回已凍結的副本。[功能 #16175] -
當使用兩個參數呼叫
Kernel#eval
時,將在已評估的程式碼中使用"(eval)"
表示__FILE__
,並使用1
表示__LINE__
。[錯誤 #4352] -
如果未呼叫文字區塊,
Kernel#lambda
現在會發出警告。[功能 #15973] -
Kernel.sleep
在非封鎖執行內容中呼叫排程器掛鉤#kernel_sleep(...)
。[功能 #16786]
-
-
-
Module#include
和Module#prepend
現在會影響已包含或預先附加接收器的類別和模組,反映如果在其他模組和類別包含或預先附加接收器之前,將參數包含在接收器中的行為。[功能 #9573]class C; end module M1; end module M2; end C.include M1 M1.include M2 p C.ancestors #=> [C, M1, M2, Object, Kernel, BasicObject]
-
Module#public
、Module#protected
、Module#private
、Module#public_class_method
、Module#private_class_method
、頂層「private」和「public」方法現在接受包含方法名稱清單的單一陣列參數。[功能 #17314] -
Module#attr_accessor
、Module#attr_reader
、Module#attr_writer
和Module#attr
方法現在傳回已定義方法名稱的陣列,作為符號。[功能 #17314] -
Module#alias_method
現在傳回已定義的別名,作為符號。[功能 #17314]
-
-
Mutex
-
Mutex
現在會依Fiber
取得,而非依Thread
取得。此變更應與所有用法相容,並在使用排程器時避免封鎖。[功能 #16792]
-
-
Queue / SizedQueue
-
Queue#pop、SizedQueue#push 和相關的方法現在可以在非封鎖的內容中呼叫
block
/unblock
排程器掛勾。 [功能 #16786]
-
-
-
新增類別以啟用平行執行。請參閱 ractor.md 以取得更多詳細資料。
-
-
-
Symbol#to_proc
現在會傳回 lambdaProc
。 [功能 #16260] -
已新增
Symbol#name
,如果符號有命名,它會傳回符號的名稱。傳回的字串是凍結的。 [功能 #16150]
-
-
-
針對攔截封鎖操作,推出
Fiber.set_scheduler
,以及針對存取目前排程器,推出Fiber.scheduler
。請參閱 fiber.md 以取得關於支援哪些操作以及如何實作排程器掛勾的更多詳細資料。 [功能 #16786] -
Fiber.blocking?
會說明目前的執行內容是否為封鎖。 [功能 #16786] -
Thread#join
在非封鎖執行內容中呼叫排程器掛勾block
/unblock
。 [功能 #16786]
-
-
-
Thread.ignore_deadlock
存取器已新增,用於停用預設的死結偵測,允許使用訊號處理器來中斷死結。 [錯誤 #13768]
-
-
-
Warning#warn
現在支援類別關鍵字引數。 [功能 #17122]
-
標準函式庫更新¶ ↑
僅限未解決的。
-
-
更新至
BigDecimal
3.0.0 -
此版本相容於
Ractor
。
-
-
-
更新至
Bundler
2.2.3
-
-
-
更新至 0.2.0
-
此版本相容於
Ractor
。
-
-
-
更新至
CSV
3.1.9
-
-
-
更新至
Fiddle
1.0.5
-
-
-
更新至
IRB
1.2.6
-
-
-
新增 :connect_timeout 至
TCPSocket.new
[功能 #17187]
-
-
-
Net::HTTP#verify_hostname=
和Net::HTTP#verify_hostname
已新增,用於略過主機名稱驗證。 [功能 #16555] -
Net::HTTP.get
、Net::HTTP.get_response
和Net::HTTP.get_print
可將請求標頭作為Hash
帶入第二個引數,前提是第一個引數為URI
。 [功能 #16686]
-
-
Net::SMTP
-
新增 SNI 支援。
-
Net::SMTP.start 引數為關鍵字引數。
-
TLS 預設不應檢查主機名稱。
-
-
-
Ractor
相容。
-
-
-
更新至
Reline
0.1.5
-
-
RubyGems
-
更新至 RubyGems 3.2.3
-
-
-
更新至
StringScanner
3.0.0 -
此版本相容於
Ractor
。
-
-
-
已移除 URI.escape 和 URI.unescape。請改用下列方法,視您的特定使用案例而定。
-
相容性問題¶ ↑
不包含功能錯誤修復。
-
Regexp
文字和所有Range
物件都已凍結。 [功能 #8948] [功能 #16377] [功能 #15504]/foo/.frozen? #=> true (42...).frozen? # => true
-
實驗性:
Hash#each
一致地產生 2 元素陣列。 [錯誤 #12706]-
現在
{ a: 1 }.each(&->(k, v) { })
會引發ArgumentError
,因為 lambda 的 arity 檢查。
-
-
現在,寫入重定向到已關閉管道的 STDOUT 時,不會顯示中斷管線錯誤訊息。 [功能 #14413]
-
TRUE
/FALSE
/NIL
常數不再定義。 -
Integer#zero?
覆寫Numeric#zero?
以進行最佳化。 [雜項 #16961] -
Enumerable#grep
和Enumerable#grep_v
在傳遞Regexp
和沒有區塊時,不再修改Regexp.last_match
。 [錯誤 #17030] -
載入 'open-uri' 不再重新定義
Kernel#open
。請直接呼叫URI.open
或改用URI#open
。 [雜項 #15893] -
SortedSet 已移除,原因是相依性及效能。
標準函式庫相容性問題¶ ↑
-
預設寶石
-
下列函式庫已從 stdlib 提升為預設寶石。
-
abbrev
-
base64
-
drb
-
debug
-
erb
-
find
-
net-ftp
-
net-http
-
net-imap
-
net-protocol
-
open-uri
-
optparse
-
pp
-
prettyprint
-
resolv-replace
-
resolv
-
rinda
-
set
-
securerandom
-
shellwords
-
tempfile
-
tmpdir
-
time
-
tsort
-
un
-
weakref
-
下列擴充功能已從 stdlib 提升為預設寶石。
-
digest
-
io-nonblock
-
io-wait
-
nkf
-
pathname
-
syslog
-
win32ole
-
-
-
已綑綁的寶石
-
net-telnet 和 xmlrpc 已從已綑綁的寶石中移除。如果您有興趣維護它們,請在 github.com/ruby/xmlrpc 或 github.com/ruby/net-telnet 上留言您的計畫。
-
-
SDBM 已從 Ruby 標準函式庫中移除。[錯誤 #8446]
-
sdbm 的問題將在 github.com/ruby/sdbm 中處理。
-
-
WEBrick 已從 Ruby 標準函式庫中移除。[功能 #17303]
-
WEBrick 的問題將在 github.com/ruby/webrick 中處理。
-
C API 更新¶ ↑
-
已移除與
$SAFE
相關的 C API 函式。[功能 #16131] -
C API 標頭檔
ruby/ruby.h
已拆分。[GH-2991]這對擴充功能函式庫應沒有影響,但使用者可能會遇到編譯速度變慢的問題。
-
記憶體檢視介面 [實驗性質]
-
Ractor
相關的 C API 已在「include/ruby/ractor.h」中引入(實驗性質)。
實作改善¶ ↑
-
針對
Ractor
的新方法快取機制。 [功能 #16614]-
由 ISeq 指向的內聯方法快取可由多個 Ractor 平行存取,即使對於方法快取也需要同步。然而,此類同步可能會造成負擔,因此引入了新的內聯方法快取機制,(1) 可拋棄式內聯方法快取 (2) 每個類別的方法快取,以及 (3) 新的失效機制。(1) 可以避免每個方法呼叫的同步,因為它只使用原子操作。有關更多詳細資訊,請參閱問題單。
-
-
在方法呼叫中使用關鍵字散佈時配置的雜湊數量已減少到最多 1 個,而且傳遞關鍵字散佈給接受特定關鍵字的方法不會配置雜湊。
-
如果沒有改良或屬性讀取器或寫入器,則在先前的呼叫中呼叫相同類型的
super
時會進行最佳化。
JIT¶ ↑
-
JIT 編譯程式碼的效能改善
-
微架構最佳化
-
在 JIT 壓縮中,由多個方法共用的原生函式會進行重複資料刪除。
-
透過一些最佳化和分割冷路徑來縮小熱路徑的程式碼大小。
-
-
執行個體變數
-
消除一些多餘的檢查。
-
在方法中,如果可能,請跳過多次檢查類別和物件。
-
最佳化某些核心類別(例如
Hash
及其子類別)中的存取。
-
-
針對某些 C 方法的
Method
內聯支援-
Kernel
:#class
、#frozen?
-
Integer
:#-@
、#~
、#abs
、#bit_length
、#even?
、#integer?
、#magnitude
、#odd?
、#ord
、#to_i
、#to_int
、#zero?
-
Struct
: 第 10 個或後續成員的讀取器方法
-
-
常數參考已內聯。
-
根據接收器類別,總是為
==
、nil?
和!
呼叫產生適當的程式碼。 -
減少分支和方法傳回的 PC 存取次數。
-
稍微最佳化 C 方法呼叫。
-
-
編譯流程改進
-
不再將暫存檔案保存在 /tmp 中。
-
限制
GC
和 JIT 編譯碼的壓縮。 -
避免在不必要時對 JIT 編譯碼執行 GC。
-
對 JIT 編譯碼執行的 GC 在背景執行緒中執行。
-
減少 Ruby 和 JIT 執行緒之間的鎖定數量。
-
靜態分析¶ ↑
RBS¶ ↑
-
RBS 是用於定義 Ruby 程式類型的新語言。它允許撰寫類別和模組的類型,其中包含進階類型,包括聯合類型、重載、泛型和用於鴨子分派的介面類型。
-
Ruby 附帶核心/標準函式庫類別的類型定義。
-
rbs
gem 已打包,用於載入和處理 RBS 檔案。
TypeProf¶ ↑
-
TypeProf 是一種基於抽象詮釋的 Ruby 程式碼類型分析工具。
-
它會讀取未註解的 Ruby 程式碼,嘗試推論其類型簽章,並以 RBS 格式列印分析結果。
-
儘管它目前僅支援 Ruby 語言的子集,但我們將持續改善語言功能、分析效能和可用性的涵蓋範圍。
-
# test.rb def foo(x) if x > 10 x.to_s else nil end end foo(42)
$ typeprof test.rb # Classes class Object def foo : (Integer) -> String? end