NEWS for Ruby 2.5.0¶ ↑
這份文件列出了各版本之間使用者可見的功能變更,不包括錯誤修正。
請注意,每個條目都簡短到沒有提供背後的原因或參考資訊。如需包含所有足夠資訊的完整變更清單,請參閱 ChangeLog 檔案或 Redmine(例如 https://bugs.ruby-lang.org/issues/$FEATURE_OR_BUG_NUMBER
)
2.4.0 版本後變更¶ ↑
語言變更¶ ↑
-
移除頂層常數查詢。[功能 #11547]
-
允許在 do/end 區塊中使用 rescue/else/ensure。[功能 #12906]
-
在字串內插中進行精煉。[功能 #13812]
核心類別更新(僅限未完成項目)¶ ↑
-
-
新增方法
-
Array#append
[功能 #12746] -
Array#prepend
[功能 #12746]
-
-
-
-
已棄用。它是 C 擴充套件的基底類別,且不需要在 Ruby 層級中公開。[功能 #3072]
-
-
-
新增方法
-
Exception#full_message
用於擷取例外的String
表示式,格式與 Ruby 列印未捕捉的例外相同。[功能 #14141] [實驗性質]
-
-
-
-
Dir.glob
提供新的可選關鍵字參數:base
。[功能 #13056] -
Dir.chdir
(無區塊參數)、Dir.open
、Dir.new
、Dir.mkdir
、Dir.rmdir
、Dir.empty?
釋放 GVL -
新增方法
-
Dir.children
[功能 #11302] -
Dir.each_child
[功能 #11302]
-
-
-
-
Enumerable#any?
、Enumerable#all?
、Enumerable#none?
和Enumerable#one?
接受樣式參數。[功能 #11286]
-
-
-
File.open
接受:newline
選項來暗示文字模式。[錯誤 #13350] -
File#path
對使用 File::Constants::TMPFILE 選項開啟的檔案引發IOError
。[功能 #13568] -
File.stat
、File.exist?
和其他使用rb_stat()
的方法釋放 GVL。[錯誤 #13941] -
File.rename
釋放 GVL。[功能 #13951] -
File::Stat#atime
、File::Stat#mtime
和File::Stat#ctime
在 Windows 8 和更新版本中支援小數秒時間戳記。[功能 #13726] -
File::Stat#ino
和File.identical?
在 Windows 8.1 及更新版本中支援 ReFS 128 位元組 ino。[功能 #13731] -
File.readable?
、File.readable_real?
、File.writable?
、File.writable_real?
、File.executable?
、File.executable_real?
、File.mkfifo
、File.readlink
、File.truncate
、File#truncate
、File.chmod
、File.lchmod
、File.chown
、File.lchown
、File.unlink
、File.utime
、File.lstat
釋放 GVL -
新方法
-
File.lutime
[功能 #4052]
-
-
-
-
新增方法
-
Hash#transform_keys
[功能 #13583] -
Hash#transform_keys!
[功能 #13583] -
Hash#slice
[功能 #8499]
-
-
-
-
IO.copy_stream
嘗試使用 copy_file_range(2) 複製卸載 [功能 #13867] -
新增方法
-
-
-
IO#close
可能會引發訊息為「串流已關閉」的錯誤,但已修正為「串流在另一個執行緒中關閉」。新的訊息對使用者來說更清楚。[錯誤 #13405]
-
-
-
Integer#round
、Integer#floor
、Integer#ceil
和Integer#truncate
始終會傳回Integer
。[錯誤 #13420] -
Integer#pow
接受模數引數來計算模指數。[功能 #12508] [功能 #11003] -
新增方法
-
Integer#allbits?
、Integer#anybits?
、Integer#nobits?
[功能 #12753] -
Integer.sqrt
[功能 #13219]
-
-
-
-
Kernel#yield_self
[功能 #6721] -
Kernel#pp
[功能 #14123] -
Kernel#warn
(…, uplevel:n) [功能 #12882]
-
-
-
新增方法
-
Method#===
會呼叫Method#call
,與Proc#===
相同 [功能 #14142]
-
-
-
-
Module#attr
、Module#attr_accessor
、Module#attr_reader
和Module#attr_writer
變為公開。[功能 #14132] -
Module#define_method
、Module#alias_method
、Module#undef_method
和Module#remove_method
變為公開。[功能 #14133]
-
-
-
Numeric#step
不再隱藏來自轉換方法的錯誤,當給定一個無法與 > 0 比較的步驟值時。[功能 #7688] -
數字比較運算子 (<,<=,>=,>) 不再在內部隱藏來自轉換方法的例外。如果轉換不可能,則在轉換中傳回 nil。[功能 #7688]
-
-
-
如果存在 getrusage(2),
Process.times
的精度會得到改進。[功能 #11952] -
新方法
-
Process.last_status
作為 $? 的別名 [功能 #14043]
-
-
-
-
當使用 <=> 比較開始和結束時,Range#initialize 不再隱藏例外,而是引發「範圍值不正確」
ArgumentError
,但會讓來自 <=> 呼叫的例外繼續執行。[功能 #7688]
-
-
-
更新至 Onigmo 6.1.3-669ac9997619954c298da971fcfacccf36909d05。
-
支援不存在運算子 github.com/k-takata/Onigmo/issues/82
-
-
支援新的 5 個與表情符號相關的 Unicode 字元屬性
-
-
-
String#-@
對未凍結的字串進行重複資料刪除。為了相容性,已凍結的字串保持不變。[功能 #13077] -
最佳化
-"literal"
(String#-@
) 以傳回相同的物件(與 Ruby 2.1+ 中的"literal".freeze
相同)[功能 #13295] -
String#casecmp
和String#casecmp?
對非字串參數傳回 nil,而不是引發TypeError
。[錯誤 #13312] -
String#start_with?
接受正規表示式 [功能 #13712] -
新增方法
-
String#delete_prefix
、String#delete_prefix!
[功能 #12694] -
String#delete_suffix
、String#delete_suffix!
[功能 #13665] -
String#each_grapheme_cluster
和String#grapheme_clusters
列舉字元群集 [功能 #13780] -
String#undump
取消轉譯String#dump
的字串 [功能 #12275]
-
-
-
-
Struct.new
使用 `keyword_init: true` 選項,以關鍵字引數初始化成員。[功能 #11925]
-
-
正規表示式/字串:將 Unicode 版本從 9.0.0 更新至 10.0.0 [功能 #13685]
-
-
由
Thread#name=
設定的說明,現在可在 Windows 10 上顯示。 -
新方法
-
Thread#fetch
[功能 #13009]
-
-
Thread.report_on_exception
的預設值現在為 true,顯示未處理的例外狀況,並在 $stderr 上終止執行緒。[功能 #14143]
-
-
-
Time.at
接收第 3 個引數,用於指定第 2 個引數的單位。[功能 #13919]
-
-
-
新增方法
-
KeyError#receiver
[功能 #12063] -
KeyError#key
[功能 #12063]
-
-
-
-
新的例外狀況類別。[功能 #13224]
-
標準函式庫更新(僅限未完成的更新)¶ ↑
-
-
更新至
BigDecimal
1.3.4 -
已新增下列功能
-
BigDecimal::VERSION
-
-
已將下列功能設定為已過時,並計畫在版本 1.4.0 中移除
-
BigDecimal.ver
-
BigDecimal#clone
和 dup 現在不會建立新的執行個體,而是傳回接收者本身。
-
-
-
支援分支涵蓋範圍和方法涵蓋範圍測量。[功能 #13901] 分支涵蓋範圍會告知您哪些分支已執行,哪些未執行。
Method
涵蓋範圍會告知您哪些方法已呼叫,哪些未呼叫。透過使用這項新功能執行測試套件,您可以知道哪些分支和方法已由測試執行,並更嚴格地評估測試套件的總體涵蓋範圍。你可以透過選項「Coverage.start」指定測量目標
Coverage.start(lines: true, branches: true, methods: true)
載入一些 Ruby 檔案後,你可以使用「Coverage.result」取得覆蓋率結果
Coverage.result #=> { "/path/to/file.rb"=> # { :lines => [1, 2, 0, nil, ...], # :branches => # { [:if, 0, 2, 1, 6, 4] => # { [:then, 1, 3, 2, 3, 8] => 0, # [:else, 2, 5, 2, 5, 8] => 2 # } # }, # :methods => { # [Object, :foo, 1, 0, 7, 3] => 2 # } # } # }
程式碼行覆蓋率的結果類型沒有改變,它只是一個包含數字的陣列,這些數字表示每行執行的次數,或「nil」,表示該行與主題無關。
分支覆蓋率的結果類型是
{ (jump base) => { (jump target) => (counter) } }
其中跳躍基礎和目標的格式為
[type, unique-id, start lineno, start column, end lineno, end column]
例如,「[:if, 0, 2, 1, 6, 4]」讀取一個「if」陳述式,範圍從第 2 行第 1 欄到第 6 行第 4 欄。「[:then, 1, 3, 2, 3, 8]」讀取一個「then」子句,範圍從第 3 行第 2 欄到第 3 行第 8 欄。請注意,行號從 1 開始,而欄號從 0 開始。因此,上述範例顯示從「if」到「then」的分支從未執行,而從「if」到「else」的分支執行兩次。
方法覆蓋率的結果類型是
{ (method key) => (counter) }
其中方法金鑰的格式為
[class, method-name, start lineno, start column, end lineno, end column]
例如,「[Object, :foo, 1, 0, 7, 3]」讀取「Object#foo」,範圍從第 1 行第 0 欄到第 7 行第 3 欄。上述範例顯示這個「Object#foo」被呼叫兩次。
注意:為了保持相容性,不傳遞任何選項給「Coverage.start」將只測量程式碼行覆蓋率,而「Coverage.result」將傳回舊格式
Coverage.result #=> { "/path/to/file.rb"=> [1, 2, 0, nil, ...] }
-
-
-
新增
ERB#result_with_hash
,以使用傳遞給Hash
物件的區域變數來呈現範本。[功能 #8631] -
erb 命令中預設的範本檔案編碼已從 ASCII-8BIT 變更為 UTF-8。[錯誤 #14095]
-
如果指定並使用 trim_mode,則會適當地修剪換行符號。Windows 上會移除重複的新行。[錯誤 #5339] [錯誤 #11464]
-
-
-
IPAddr
不再接受無效的位址遮罩。[錯誤 #13399] -
IPAddr#ipv4_compat
和IPAddr#ipv4_compat?
已標示為不建議使用。[錯誤 #13769] -
新增方法
-
IPAddr#private?
[功能 #11666] -
IPAddr#link_local?
[功能 #10912]
-
-
-
反向列印堆疊追蹤和錯誤訊息 [功能 #8661] [實驗性質]
-
‘binding.irb` 自動需要 irb 並執行 [錯誤 #13099] [實驗性質]
-
‘binding.irb` 在啟動時顯示呼叫它的程式碼行周圍的原始碼 [功能 #14124]
-
-
矩陣
-
新增方法
-
Matrix.combine 和 Matrix#combine [功能 #10903]
-
Matrix#hadamard_product 和 Matrix#entrywise_product
-
-
-
-
Net::HTTP.new
支援 no_proxy 參數 [功能 #11195] -
Net::HTTP#min_version
和Net::HTTP#max_version
[功能 #9450] -
新增更多 HTTP 狀態類別
-
Net::HTTP::STATUS_CODES 新增為 HTTP 狀態碼儲存庫 [雜項 #12935]
-
Net::HTTP#proxy_user
和Net::HTTP#proxy_pass
反映 http_proxy 環境變數,如果系統的環境變數是多使用者安全的。[錯誤 #12921]
-
-
open-uri
-
URI.open
方法定義為 open-uri 的Kernel.open
的別名。open-uri 的Kernel.open
將在未來被棄用。
-
-
-
將 Ruby/OpenSSL 從版本 2.0 更新到 2.1。變更記載在 ext/openssl/History.md 中的「版本 2.1.0」區段。
-
-
-
新方法
-
Pathname#glob
[功能 #7360]
-
-
-
-
更新至
Psych
3.0.2。-
將備用選項轉換為關鍵字引數 github.com/ruby/psych/pull/342
-
新增 :symbolize_names 選項至
Psych.load
、Psych.safe_load
,例如JSON.parse
github.com/ruby/psych/pull/333、github.com/ruby/psych/pull/337 -
新增
Psych::Handler#event_location
github.com/ruby/psych/pull/326 -
將凍結字串文字設為 true github.com/ruby/psych/pull/320
-
反序列化時間時保留時區偏移 github.com/ruby/psych/pull/316
-
移除 syck 寶石的已棄用方法別名 github.com/ruby/psych/pull/312
-
-
-
-
新增 RbConfig::LIMITS 以提供 C 類型的限制。這在載入 rbconfig/sizeof 時可用。
-
-
-
Ripper::EXPR_BEG 等等,用於 Ripper#state。
-
新方法
-
Ripper#state 用於說明掃描器的狀態。[功能 #13686]
-
-
-
-
更新至
RDoc
6.0.1。-
-
這大幅提升了產生文件的速度。
-
它也促進了未來支援新語法的可能性。
-
支援過去幾年 Ruby 的許多新語法。
-
使用 “frozen_string_literal: true”。效能調查:gist.github.com/aycabta/abdfaa75ea8a6877eeb734e942e73800
-
支援 did_you_mean。
-
-
-
Rubygems
-
更新至 Rubygems 2.7.3。
-
-
-
新方法
-
SecureRandom.alphanumeric
-
-
-
-
StringIO#write
接受多個參數
-
-
-
新增方法
-
-
-
相對路徑運算不再將連續斜線壓縮成單一斜線。[錯誤 #8352]
-
-
WEBrick
-
新增伺服器名稱指示 (SNI) 支援 [功能 #13729]
-
支援
Proc
物件作為主體回應 [功能 #855] -
以 RubyGem 發行 [功能 #13173]
-
避免
Kernel#open
產生意外行為 [雜項 #14216]
-
-
-
Zlib::GzipWriter#write
接受多個參數
-
相容性問題(不含功能錯誤修正)¶ ↑
-
-
BasicSocket#read_nonblock
和BasicSocket#write_nonblock
不再將 O_NONBLOCK 檔案描述旗標設定為副作用(僅限 Linux)[功能 #13362]
-
-
-
Random.raw_seed 重新命名為
Random.urandom
。由於 [錯誤 #9569],它現在適用於非播種目的。
-
-
-
Socket::Ifaddr#vhid
已新增 [功能 #13803]
-
-
為了提升速度,重新實作了 ConditionVariable、Queue 和 SizedQueue。它們不再繼承
Struct
。[功能 #13552]
標準函式庫相容性問題(不包含功能錯誤修正)¶ ↑
-
寶石化
-
將下列標準函式庫提升為預設寶石。
-
cmath
-
csv
-
date
-
dbm
-
etc
-
fcntl
-
fiddle
-
fileutils
-
gdbm
-
ipaddr
-
scanf
-
sdbm
-
stringio
-
strscan
-
webrick
-
zlib
-
-
-
-
Logger.new
(“| command”) 過去會意外開啟命令。這已被禁止,而現在 Logger#initialize 僅會將String
參數視為檔案名稱,符合其規格。[錯誤 #14212]
-
-
-
Net::HTTP#start
現在會預設將 :ENV 傳遞給 p_addr。[錯誤 #13351] 若要避免這項變更,請明確傳遞 nil。
-
-
mathn.rb
-
已從標準函式庫中移除。[功能 #10169]
-
-
Rubygems
-
已從標準函式庫中移除 “ubygems.rb” 檔案。自 Ruby 1.9 起已無此必要。
-
受支援平台變更¶ ↑
實作改善¶ ↑
-
(這可能不是「使用者可見的功能變更」,但)
Hash
類別的雜湊函數現在為 SipHash13。[功能 #13017] -
SecureRandom
現在優先使用作業系統提供的來源,而非OpenSSL
。[錯誤 #9569] -
重新撰寫 Mutex 以縮小體積並提升速度 [功能 #13517]
-
透過延遲
Proc
配置,改善使用區塊參數傳遞區塊的效能 [功能 #14045] -
使用動態工具來執行
TracePoint
掛鉤,而非使用「trace」指令,以避免產生額外負擔 [功能 #14104] -
ERB
現在從範本產生的程式碼速度為 Ruby 2.4 的兩倍
其他變更¶ ↑
-
如果 $stderr 未變更且為 tty,則以反向順序印出追蹤堆疊和錯誤訊息。[功能 #8661] [實驗性質]
-
如果 $stderr 未變更且為 tty,則以粗體/底線文字印出錯誤訊息。[功能 #14140] [實驗性質]
-
configure 選項 –with-ext 現在強制要求其參數。因此,例如,如果您執行 ./configure –with-ext=openssl,+,則保證會編譯 openssl 函式庫,否則建置會異常失敗。
不過,請務必在參數結尾新增 “,+”。否則,只會建置 openssl。[功能 #13302]