NEWS for Ruby 3.3.0¶ ↑
這份文件列出 3.2.0 發行版以來,使用者可見的功能變更,不包含錯誤修正。
請注意,每個條目都簡化到最少,詳細資訊請參閱連結。
命令列選項¶ ↑
-
新增
performance
警告類別。即使在詳細模式下,它們也不會預設顯示。請使用-W:performance
或Warning[:performance] = true
開啟它們。 [功能 #19538] -
新增一個
RUBY_CRASH_REPORT
環境變數,用於將 Ruby 崩潰報告重新導向到一個檔案或子指令。請參閱 ruby 手冊的BUG REPORT ENVIRONMENT
區段以取得更多詳細資訊。 [功能 #19790]
核心類別更新¶ ↑
注意:我們只列出傑出的類別更新。
-
-
Array#pack
現在會對未知的指令引發ArgumentError
。 [錯誤 #19150]
-
-
-
新增
Dir.for_fd
,用於傳回由提供的目錄檔案描述符所指定的目錄的Dir
物件。 [功能 #19347] -
新增
Dir.fchdir
,用於將目錄變更為由提供的目錄檔案描述符所指定的目錄。 [功能 #19347]
-
-
-
Encoding#replicate
已移除,它已過時。 [功能 #18949]
-
-
-
引入
Fiber#kill
。 [錯誤 #595]fiber = Fiber.new do while true puts "Yielding..." Fiber.yield end ensure puts "Exiting..." end fiber.resume # Yielding... fiber.kill # Exiting...
-
-
-
MatchData#named_captures
現在接受選用的symbolize_names
關鍵字。 [功能 #19591]
-
-
-
新增
Module#set_temporary_name
,用於設定模組的暫時名稱。 [功能 #19521]
-
-
-
新的核心類別,用於建立具有弱參照的集合。此類別使用相等語意來查詢鍵,就像一般的 hash,但它不會對鍵持有強參照。 [功能 #18498]
-
-
-
新增
ObjectSpace::WeakMap#delete
,用於急切清除弱映射條目。 [功能 #19561]
-
-
-
現在
Proc#dup
和Proc#clone
分別會呼叫#initialize_dup
和#initialize_clone
鉤子。 [功能 #19362]
-
-
-
新的
Process.warmup
方法會通知 Ruby 虛擬機器開機順序已完成,現在是最佳化應用程式的時機。這對於長時間執行的應用程式很有用。實際執行的最佳化完全取決於實作,且未來可能會在未通知的情況下變更。 [功能 #18885]
-
-
-
Process::Status#&
和Process::Status#>>
已過時。 [錯誤 #19868]
-
-
-
Range#reverse_each
現在可以處理具有Integer
端點的無開頭範圍。 [功能 #18515] -
Range#reverse_each
現在會對無限範圍引發TypeError
。 [功能 #18551] -
新增
Range#overlap?
來檢查兩個範圍是否重疊。 [功能 #19839]
-
-
-
新增
Refinement#target
作為Refinement#refined_class
的替代方案。Refinement#refined_class
已過時,並將在 Ruby 3.4 中移除。 [功能 #19714]
-
-
-
String#unpack
現在會對未知指令引發ArgumentError
。 [錯誤 #19150] -
String#bytesplice
現在接受新引數索引/長度或要複製的來源字串範圍。 [功能 #19314]
-
-
-
Thread::Queue#freeze
現在會引發TypeError
。 [錯誤 #17146]
-
-
-
Thread::SizedQueue#freeze
現在會引發TypeError
。 [錯誤 #17146]
-
-
-
TracePoint
支援rescue
事件。當引發的例外狀況被救援時,TracePoint
會觸發掛鉤。rescue
事件只支援 Ruby 層級的rescue
。 [功能 #19572]
-
Stdlib 更新¶ ↑
-
RubyGems 與
Bundler
會在使用者未將下列 gem 加入 Gemfile 或 gemspec 而使用require
時發出警告。這是因為這些 gem 將會在未來的 Ruby 版本中成為內建 gem。如果你使用 bootsnap gem,此警告將會被抑制。我們建議你至少執行一次使用DISABLE_BOOTSNAP=1
環境變數的應用程式。這是此版本的限制。[功能 #19351] [功能 #19776] [功能 #19843]-
abbrev
-
base64
-
bigdecimal
-
csv
-
drb
-
getoptlong
-
mutex_m
-
nkf
-
observer
-
racc
-
resolv-replace
-
rinda
-
syslog
-
abbrev
-
base64
-
bigdecimal
-
csv
-
drb
-
getoptlong
-
mutex_m
-
nkf
-
observer
-
racc
-
resolv-replace
-
rinda
-
syslog
-
-
Socket#recv
和Socket#recv_nonblock
會在關閉連線時傳回nil
,而不是空字串。Socket#recvmsg
和Socket#recvmsg_nonblock
會在關閉連線時傳回nil
,而不是空封包。 [錯誤 #19012] -
名稱解析,例如
Socket.getaddrinfo
、Socket.getnameinfo
、Addrinfo.getaddrinfo
等,現在可以中斷。 [功能 #19965] -
Random::Formatter#alphanumeric
已擴充,接受選用的chars
關鍵字參數。 [功能 #18183]
已新增下列預設 gem。
-
prism 0.19.0
已更新下列預設 gem。
-
RubyGems 3.5.3
-
abbrev 0.1.2
-
base64 0.2.0
-
benchmark 0.3.0
-
bigdecimal 3.1.5
-
bundler 2.5.3
-
cgi 0.4.1
-
csv 3.2.8
-
date 3.3.4
-
delegate 0.3.1
-
drb 2.2.0
-
english 0.8.0
-
erb 4.0.3
-
error_highlight 0.6.0
-
etc 1.4.3
-
fcntl 1.1.0
-
fiddle 1.1.2
-
fileutils 1.7.2
-
find 0.2.0
-
getoptlong 0.2.1
-
io-console 0.7.1
-
io-nonblock 0.3.0
-
io-wait 0.3.1
-
ipaddr 1.2.6
-
irb 1.11.0
-
json 2.7.1
-
logger 1.6.0
-
mutex_m 0.2.0
-
net-http 0.4.0
-
net-protocol 0.2.2
-
nkf 0.1.3
-
observer 0.1.2
-
open-uri 0.4.1
-
open3 0.2.1
-
openssl 3.2.0
-
optparse 0.4.0
-
ostruct 0.6.0
-
pathname 0.3.0
-
pp 0.5.0
-
prettyprint 0.2.0
-
pstore 0.1.3
-
psych 5.1.2
-
rdoc 6.6.2
-
readline 0.0.4
-
reline 0.4.1
-
resolv 0.3.0
-
rinda 0.2.0
-
securerandom 0.3.1
-
set 1.1.0
-
shellwords 0.2.0
-
singleton 0.2.0
-
stringio 3.1.0
-
strscan 3.0.7
-
syntax_suggest 2.0.0
-
syslog 0.1.2
-
tempfile 0.2.1
-
time 0.3.0
-
timeout 0.4.1
-
tmpdir 0.2.0
-
tsort 0.2.0
-
un 0.3.0
-
uri 0.13.0
-
weakref 0.1.3
-
win32ole 1.8.10
-
yaml 0.3.0
-
zlib 3.1.0
下列捆綁的 gem 已從預設 gem 提升。
-
racc 1.7.3
下列捆綁的 gem 已更新。
-
minitest 5.20.0
-
rake 13.1.0
-
test-unit 3.6.1
-
rexml 3.2.6
-
rss 0.3.0
-
net-ftp 0.3.3
-
net-imap 0.4.9
-
net-smtp 0.4.0
-
rbs 3.4.0
-
typeprof 0.21.9
-
debug 1.9.1
請參閱 GitHub 發行版本,例如 Logger 或變更紀錄,以取得預設 gem 或捆綁 gem 的詳細資料。
Prism
¶ ↑
-
將 Prism 分析器 引入為預設 gem
-
Prism
是 Ruby 語言的攜帶式、容錯且可維護的遞迴下降分析器
-
-
如果您有興趣貢獻,您可以在 Prism 儲存庫 上直接提出拉取請求或問題
-
現在您可以使用
ruby --parser=prism
或RUBYOPT="--parser=prism"
來試驗Prism
編譯器。請注意,此旗標僅供偵錯使用。
相容性問題¶ ↑
-
下列檔案開啟方法的子程序建立/分岔已過時。 [功能 #19630]
-
當給予非 lambda、非文字區塊時,
Kernel#lambda
現在會引發ArgumentError
,而非回傳未修改的區塊。這些用法自 Ruby 3.0.0 起,已在Warning[:deprecated]
類別中發出警告。 [功能 #19777] -
RUBY_GC_HEAP_INIT_SLOTS
環境變數已過時並已移除。應改用環境變數RUBY_GC_HEAP_%d_INIT_SLOTS
。 [功能 #19785] -
it
在沒有普通參數的區塊中呼叫而沒有參數已過時。it
將會是 Ruby 3.4 中第一個區塊參數的參考。 [功能 #18980] -
NoMethodError
的錯誤訊息已變更,不再使用目標物件的#inspect
以提高效率,並改為顯示「ClassName 的執行個體」。 [功能 #18285]([1] * 100).nonexisting # undefined method `nonexisting' for an instance of Array (NoMethodError)
-
現在禁止在使用匿名參數的區塊內轉發匿名參數。 [功能 #19370]
標準函式庫相容性問題¶ ↑
-
racc
已升級為套件寶石。-
如果您在套件管理環境中使用
racc
,您需要將racc
加入您的Gemfile
。
-
-
ext/readline
已停用-
我們有
reline
,這是與ext/readline
API 相容的純 Ruby 實作。我們未來將依賴reline
。如果您需要使用ext/readline
,您可以透過 rubygems.org 安裝ext/readline
,使用gem install readline-ext
。 -
我們不再需要安裝像
libreadline
或libedit
這樣的函式庫。
-
C API 更新¶ ↑
-
rb_postponed_job
更新 -
新的 API 和已過時的 API(詳細資訊請參閱註解)
-
已新增:
rb_postponed_job_preregister()
-
已新增:
rb_postponed_job_trigger()
-
已過時:
rb_postponed_job_register()
(以及語意變更,請參閱下方) -
已過時:
rb_postponed_job_register_one()
-
已新增:
rb_postponed_job_preregister()
-
已新增:
rb_postponed_job_trigger()
-
已過時:
rb_postponed_job_register()
(以及語意變更,請參閱下方) -
已過時:
rb_postponed_job_register_one()
-
-
延後工作 API 已變更,以解決一些罕見的崩潰。為了解決此問題,我們引入了兩個新的 API,並棄用目前的 API。這些函式的語意也略有變更;
rb_postponed_job_register
現在的行為類似於once
變體,其中使用相同func
的多個呼叫可能會合併成單一的func
執行 [功能 #20057] -
內部執行緒事件掛鉤 API 的一些更新
-
rb_internal_thread_event_data_t
具有目標 Ruby 執行緒 (VALUE) 和回呼函式 (rb_internal_thread_event_callback
) 會接收它。 github.com/ruby/ruby/pull/8885 -
引入了下列函式,以從內部執行緒事件掛鉤 API 處理 Ruby 執行緒的本地資料 (自 Ruby 3.2 起引入)。 github.com/ruby/ruby/pull/8936
-
rb_internal_thread_specific_key_create()
-
rb_internal_thread_specific_get()
-
rb_internal_thread_specific_set()
-
-
引入了
rb_profile_thread_frames()
以從特定執行緒取得框架。 [功能 #10602] -
引入了
rb_data_define()
以定義Data
。 [功能 #19757] -
引入了
rb_ext_resolve_symbol()
以從擴充套件函式庫搜尋函式。 [功能 #20005] -
IO
相關更新 -
rb_io_t
的詳細資料將會隱藏,並且已為每個成員新增已棄用的屬性。 [功能 #19057] -
引入了
rb_io_path(VALUE io)
以取得io
的路徑。 -
rb_io_closed_p(VALUE io)
以取得io
的開啟或關閉。 -
rb_io_mode(VALUE io)
以取得io
的模式。 -
引入了
rb_io_open_descriptor()
以從檔案描述符建立IO
物件。
實作改進¶ ↑
剖析器¶ ↑
-
使用 Lrama LALR 剖析器產生器 取代 Bison。不再需要安裝 Bison 才能從原始碼建立 Ruby。我們將不再遭受 bison 相容性問題,而且我們可以透過將其實作到 Lrama 來使用新功能。 [功能 #19637]
-
請參閱 Ruby 剖析器的未來願景 以取得詳細資訊。
-
Lrama 內部解析器是一個由 Racc 產生的 LR 解析器,以利於維護。
-
參數化規則
(?, *, +)
獲得支援,它將用於 Ruby parse.y。
GC
/ 記憶體管理¶ ↑
-
相較於 Ruby 3.2 有重大的效能提升
-
引進了一個新的
REMEMBERED_WB_UNPROTECTED_OBJECTS_LIMIT_RATIO
調整變數,用於控制造成主要GC
回收觸發的未保護物件數量。預設值設為0.01
(1%)。這大幅減少了主要GC
回收的頻率。[功能 #19571] -
為許多缺少寫入障礙的核心類型實作了寫入障礙,特別是
Time
、Enumerator
、MatchData
、Method
、File::Stat
、BigDecimal
和其他幾個。這大幅減少了次要GC
回收時間和主要GC
回收頻率。 -
大多數核心類別現在使用可變寬度配置,特別是
Hash
、Time
、Thread::Backtrace
、Thread::Backtrace::Location
、File::Stat
、Method
。這使得這些類別配置和釋放速度更快,使用更少的記憶體,並減少堆疊碎片。
-
defined?(@ivar)
使用Object
形狀進行最佳化。
YJIT¶ ↑
-
相較於 Ruby 3.2 有重大的效能提升
-
對展開和剩餘引數的支援已獲得改善。
-
為虛擬機的堆疊操作配置暫存器。
-
編譯更多具有可選引數的呼叫。也編譯
Exception
處理常式。 -
不再退出至直譯器,以處理不支援的呼叫類型和巨態呼叫位置。
-
內嵌 Rails
#blank?
和 {特定#present?
} 等基本方法。 -
Integer#*
、Integer#!=
、String#!=
、String#getbyte
、Kernel#block_given?
、Kernel#is_a?
、Kernel#instance_of?
和Module#===
獲得特別最佳化。 -
編譯速度現在比 Ruby 3.2 稍快。
-
現在在 Optcarrot 上比直譯器快 3 倍以上!
-
大幅改善 Ruby 3.2 的記憶體使用量
-
編譯程式碼的元資料使用更少的記憶體。
-
當應用程式有超過 40,000 個 ISEQ 時,
--yjit-call-threshold
會自動從 30 提高到 120。 -
新增
--yjit-cold-threshold
來略過編譯冷門 ISEQ。 -
在 Arm64 上產生更精簡的程式碼。
-
-
程式碼
GC
現在預設停用 -
--yjit-exec-mem-size
被視為硬性限制,新的程式碼編譯會在此處停止。 -
如果需要,您仍可以使用
--yjit-code-gc
啟用程式碼GC
-
新增
RubyVM::YJIT.enable
,可以在執行時期啟用 YJIT -
您可以在不修改命令列參數或環境變數的情況下啟動 YJIT。Rails 7.2 將使用此方法預設啟用 YJIT。
-
這也可以用於在應用程式啟動完成後才啟用 YJIT。如果您想在啟動時停用 YJIT,同時使用其他 YJIT 選項,可以使用
--yjit-disable
。 -
預設提供更多 YJIT 統計資料
-
現在預設提供
yjit_alloc_size
和更多與元資料相關的統計資料。 -
--yjit-stats
產生的ratio_in_yjit
統計資料現在在正式版本中提供,不再需要特殊統計資料或開發版本才能存取大部分統計資料。 -
新增更多剖析功能
-
新增
--yjit-perf
以利使用 Linux perf 進行剖析。 -
--yjit-trace-exits
現在支援使用--yjit-trace-exits-sample-rate=N
進行抽樣。 -
更徹底的測試和多項錯誤修正
-
新增
--yjit-stats=quiet
以避免在結束時列印統計資料。
MJIT¶ ↑
-
MJIT 已移除。
-
--disable-jit-support
已移除。請考慮改用--disable-yjit --disable-rjit
。
-
RJIT¶ ↑
-
推出純 Ruby JIT 編譯器 RJIT。
-
RJIT 僅支援 Unix 平台上的 x86_64 架構。
-
與 MJIT 不同,它在執行時期不需要 C 編譯器。
-
-
RJIT 僅供實驗用途。
-
您應該繼續在生產環境中使用 YJIT。
-
M:N Thread
排程器¶ ↑
-
-
背景:Ruby 1.8 及之前版本使用 M:1 執行緒排程器(M 個 Ruby 執行緒搭配 1 個原生執行緒。稱為使用者層級執行緒或綠色執行緒)。Ruby 1.9 及之後版本使用 1:1 執行緒排程器(1 個 Ruby 執行緒搭配 1 個原生執行緒)。與 1:1 執行緒相比,M:1 執行緒消耗較少資源,因為它只需要 1 個原生執行緒。然而,很難支援所有封鎖操作的內容切換,因此從 Ruby 1.9 開始採用 1:1 執行緒。M:N 執行緒排程器使用 N 個原生執行緒來執行 M 個 Ruby 執行緒(N 通常為小數字)。它不需要與 Ruby 執行緒相同數量的原生執行緒(類似於 M:1 執行緒排程器)。此外,我們的 M:N 執行緒也像 1:1 執行緒一樣,能良好地支援封鎖操作。請參閱此問題追蹤以取得更多詳細資訊。我們的 M:N 執行緒排程器參考了 Go 語言中的 goroutine 排程器。
-
在 ractor 中,由於實作的關係,同一時間只能執行 1 個執行緒。因此,僅使用一個
Ractor
的應用程式(大部分應用程式)M:N 執行緒排程器會像 M:1 執行緒排程器一樣運作,並從 Ruby 1.8 進一步延伸。 -
M:N 執行緒排程器可能會導致 C 擴充套件不相容,因此它在主 Ractor 上預設停用。
RUBY_MN_THREADS=1
環境變數將會啟用它。在非主 Ractor 上,M:N 執行緒排程器已啟用(而且現在無法停用)。 -
N
(原生執行緒的數量)可以用RUBY_MAX_CPU
環境變數指定。預設值為 8。請注意,會使用超過N
個原生執行緒來支援許多類型的封鎖操作。
-