NEWS for Ruby 2.6.0¶ ↑
此文件列出版本間可見的使用者功能變更,不包含錯誤修正。
請注意,每個項目都簡短到沒有提供背後原因或參考資訊。如需包含所有足夠資訊的完整變更清單,請參閱 ChangeLog 檔案或 Redmine(例如 https://bugs.ruby-lang.org/issues/$FEATURE_OR_BUG_NUMBER
)
自 2.5.0 版本以來的變更¶ ↑
語言變更¶ ↑
-
$SAFE
現在是處理程序的全球狀態,且可以再次設定為 0。[功能 #14250] -
精煉發生在區塊傳遞時。[功能 #14223]
-
精煉發生在 Kernel#public_send。[功能 #15326]
-
改進在 Kernel#respond_to? 中進行。[功能 #15327]
-
現在沒有
rescue
的else
會導致語法錯誤。[實驗性] [功能 #14606] -
常數名稱可以以非 ASCII 大寫字母開頭。[功能 #13770]
-
引入了無限範圍。您可以使用沒有結尾的
Range
,例如(0..)
(或類似地(0...)
)。[功能 #12912]以下顯示典型用例
ary[1..] # identical to ary[1..-1] (1...).each {|index| block } # infinite loop from index 1 ary.zip(1..) {|elem, index| block } # ary.each.with_index(1) { }
-
關鍵字參數雜湊中的非符號鍵會導致例外情況。
-
移除了「遮蔽外部局部變數」警告。[功能 #12490]
現在您可以編寫以下內容而不會收到警告
user = users.find {|user| cond(user) }
-
如果沒有捕獲到例外情況並列印其回溯和錯誤訊息,請列印例外情況的
cause
。[功能 #8257] -
flip-flop 語法已棄用。[功能 #5400]
核心類別更新(僅未完成的)¶ ↑
陣列
- 新方法
-
新增
Array#union
和Array#difference
執行個體方法。[功能 #14097]
-
- 修改方法
-
Array#to_h
現在接受將元素對應到新鍵/值對的區塊。[功能 #15143]
-
- 別名方法
-
Array#filter
是Array#select
的新別名。[功能 #13784] -
Array#filter!
是Array#select!
的新別名。[功能 #13784]
-
繫結
- 新方法
-
新增
Binding#source_location
。[功能 #14230]此方法傳回繫結的來源位置,一個包含
__FILE__
和__LINE__
的 2 元素陣列。傳統上,相同的資訊可以透過eval("[__FILE__, __LINE__]", binding)
擷取,但我們計畫變更此行為,讓Kernel#eval
忽略繫結的來源位置 [錯誤 #4352]。因此,使用者應該使用此新引進的方法,而不是Kernel#eval
。
-
目錄
- 新方法
-
新增
Dir#each_child
和Dir#children
執行個體方法。[功能 #13969]
-
列舉
- 新方法
-
Enumerable#chain
傳回一個列舉器物件,依序迭代接收器和每個參數的元素。[功能 #15144]
-
- 修改方法
-
Enumerable#to_h
現在接受將元素對應到新鍵/值對的區塊。[功能 #15143]
-
- 別名方法
-
Enumerable#filter
是Enumerable#select
的新別名。[功能 #13784]
-
Enumerator::ArithmeticSequence
-
這是用來表示算術序列產生器的類別,算術序列是由公差定義的數字序列。它可用於表示類似 Python 切片的內容。您可以從
Numeric#step
和Range#step
取得這個類別的執行個體。
-
Enumerator::Chain
-
這是用來表示可串接列舉的類別,可串接列舉會像單一列舉一樣運作,由
Enumerable#chain
和Enumerator#+
等方法產生。
-
Enumerator::Lazy
- 別名方法
-
Enumerator::Lazy#filter
是Enumerator::Lazy#select
的新別名。[功能 #13784]
-
Enumerator
- 新方法
-
Enumerator#+
會傳回列舉物件,會逐一迭代接收者的元素,然後迭代其他運算元的元素。[功能 #15144]
-
ENV
- 修改方法
-
ENV.to_h
現在接受會將名稱和值對應到新金鑰和新值的區塊。[功能 #15143]
-
Exception
- 新選項
-
Exception#full_message
會採用:highlight
和:order
選項。[錯誤 #14324]
-
Hash
- 已修改的方法
-
Hash#merge
、Hash#merge!
和Hash#update
現在接受多個引數。[功能 #15111] -
Hash#to_h
現在接受會將金鑰和值對應到新金鑰和新值的區塊。[功能 #15143]
-
- 別名方法
-
Hash#filter
是Hash#select
的新別名。[功能 #13784] -
Hash#filter!
是Hash#select!
的新別名。[功能 #13784]
-
IO
- 新選項
-
新增新模式字元
'x'
,用於以獨佔存取權限開啟檔案。[功能 #11258]
-
Kernel
- 別名方法
-
Kernel#then
是Kernel#yield_self
的新別名。[功能 #14594]
-
- 新選項
-
Kernel#Complex
、Kernel#Float
、Kernel#Integer
和Kernel#Rational
會採用:exception
選項,用於指定錯誤處理的方式。[功能 #12732] -
Kernel#system
採用:exception
選項,在失敗時引發例外狀況。[功能 #14386]
-
- 不相容變更
-
Kernel#system
和Kernel#exec
沒有關閉非標準檔案描述子(:close_others
選項的預設值已變更為false
,但我們仍會在我們建立的描述子上設定FD_CLOEXEC
旗標)。[雜項 #14907]
-
KeyError
- 新選項
-
KeyError.new
接受:receiver
和:key
選項,以在 Ruby 程式碼中設定接收者和金鑰。[功能 #14313]
-
Method
Module
- 已修改的方法
-
Module#method_defined?
、Module#private_method_defined?
和Module#protected_method_defined?
現在接受第二個參數作為選配。如果它為true
(預設值),它會檢查祖先模組/類別,或只檢查類別本身。[功能 #14944]
-
NameError
- 新選項
-
NameError.new
接受:receiver
選項,以在 Ruby 程式碼中設定接收者。[功能 #14313]
-
NilClass
- 新方法
-
新增
NilClass#=~
以確保相容性。[功能 #15231]
-
NoMethodError
- 新選項
-
NoMethodError.new
接受:receiver
選項,以在 Ruby 程式碼中設定接收者。[功能 #14313]
-
Numeric
- 不相容變更
-
Numeric#step
現在會傳回Enumerator::ArithmeticSequence
類別的執行個體,而不是Enumerator
類別的執行個體。
-
OpenStruct
- 修改方法
-
OpenStruct#to_h
現在接受區塊,用於將金鑰和值對應到新的金鑰和值。[功能 #15143]
-
Proc
Random
- 新方法
-
新增
Random.bytes
。[功能 #4938]
-
Range
- 新方法
-
新增
Range#%
執行個體方法。[功能 #14697]
-
- 不相容變更
-
Range#===
現在使用#cover?
而不是#include?
方法。 [功能 #14575] -
Range#cover?
現在接受Range
物件。 [功能 #14473] -
Range#step
現在傳回Enumerator::ArithmeticSequence
類別的實例,而不是Enumerator
類別的實例。
-
- 正規表示式/字串
-
將 Unicode 版本從 10.0.0 更新至 11.0.0。 [功能 #14802]
這包括重寫字元叢集 (/X/) 演算法,以及在
String#downcase
中對喬治亞語 MTAVRULI 進行特殊處理。 -
將 Emoji 版本從 5.0 更新至 11.0.0 [功能 #14802]
-
RubyVM::AbstractSyntaxTree
- 新方法
-
RubyVM::AbstractSyntaxTree.parse
會分析給定的字串並傳回 AST 節點。 [實驗性質] -
RubyVM::AbstractSyntaxTree.parse_file
會分析給定的檔案並傳回 AST 節點。 [實驗性質] -
RubyVM::AbstractSyntaxTree.of
會傳回給定程序或方法的 AST 節點。 [實驗性質]
-
RubyVM
- 新方法
-
RubyVM.resolve_feature_path 會找出將由 “require(feature)” 載入的檔案。 [實驗性質] [功能 #15230]
-
字串
-
String#crypt
現在已棄用。 [功能 #14915]
- 新功能
-
String#split
如果給定區塊,會將每個子字串傳遞給該區塊。 [功能 #4780]
-
-
結構
- 修改方法
-
Struct#to_h
現在接受一個區塊,用於將鍵值對應到新的鍵值。 [功能 #15143]
-
- 別名方法
-
Struct#filter
是Struct#select
的新別名。 [功能 #13784]
-
時間
- 新功能
-
Time.new
和Time#getlocal
接受時區物件以及 UTC 偏移字串。Time#+
、Time#-
和 Time#succ 也會保留時區。 [功能 #14850]
-
追蹤點
- 新功能
-
支援 “script_compiled” 事件。 [功能 #15287]
-
- 新方法
-
TracePoint#parameters
[功能 #14694] -
TracePoint#instruction_sequence
[功能 #15287] -
TracePoint#eval_script
[功能 #15287]
-
- 修改方法
-
TracePoint#enable
接受新關鍵字「target:」和「target_line:」。[功能 #15289]
-
標準函式庫更新(僅限未完成的更新)¶ ↑
BigDecimal
-
更新至版本 1.4.0。此版本包含多個相容性問題,詳情請見下方的相容性問題區段。
- 修改方法
-
BigDecimal() 接受類似於 Float() 的新關鍵字「exception:」。
-
- 近期版本之間的差異注意事項
-
您應該了解近期 bigdecimal 版本之間的差異。請根據下列資訊選擇合適的 bigdecimal 版本。
-
1.3.5 具有沒有「exception:」關鍵字的
BigDecimal.new
。當您指定「-w」選項時,您會看到BigDecimal.new
的不建議使用警告。BigDecimal()、BigDecimal.new
和 Object#to_d 方法相同。 -
1.4.0 具有帶有「exception:」關鍵字的
BigDecimal.new
。您總是會看到BigDecimal.new
的不建議使用警告。Object#to_d 方法不同於 BigDecimal() 和BigDecimal.new
。 -
2.0.0 將在 Ruby 2.6.0 發布後不久發布。此版本將不會有
BigDecimal.new
方法。
-
Bundler
-
將
Bundler
加入標準函式庫。[功能 #12733] -
使用最新的穩定版本 1.17.2。
-
Coverage
-
新增 oneshot_lines 模式。[功能 #15022]
此模式檢查「每一行是否至少執行過一次」,而不是「每一行執行了幾次」。每一行的掛鉤最多只會觸發一次,且在觸發後掛鉤標記會被移除,也就是說,它以零開銷執行。
- 新選項
-
將
:oneshot_lines
關鍵字引數新增至Coverage.start
。 -
將
:stop
和:clear
關鍵字引數新增至Coverage.result
。如果clear
為 true,它會將計數器清除為零。如果stop
為 true,它會停用覆蓋率量測。
-
- 新方法
-
Coverage.line_stub
,這是一個簡單的輔助函式,用於根據給定的原始碼建立行覆蓋率的「存根」。
-
CSV
-
升級至 3.0.2。這包含效能改善,特別是寫入。寫入速度快了約 2 倍。請參閱 github.com/ruby/csv/blob/master/NEWS.md。
-
ERB
- 新選項
-
新增
:trim_mode
和:eoutvar
關鍵字引數至ERB.new
。現在,除了第一個引數以外的非關鍵字引數已逐漸不建議使用,並將在 Ruby 2.5 成為 EOL 時移除。[功能 #14256] -
erb 指令的
-S
選項已不建議使用,並將在下一版本中移除。
-
FileUtils
- 新方法
-
FileUtils#cp_lr
。[功能 #4189]
-
- Matrix
- 新方法
-
Matrix#antisymmetric?, Matrix#skew_symmetric?
-
Matrix#map!, Matrix#collect! [功能 #14151]
-
Matrix#[]=
-
Vector#map!, Vector#collect!
-
Vector#[]=
-
Net
- 新選項
-
新增
:write_timeout
關鍵字引數至Net::HTTP.new
。[功能 #13396]
-
- 新方法
-
新增
Net::HTTP#write_timeout
和Net::HTTP#write_timeout=
。[功能 #13396]
-
- 新常數
-
新增
Net::HTTPClientException
以不建議使用 Net::HTTPServerException,其名稱具有誤導性。[錯誤 #14688]
-
NKF
-
升級至 nkf v2.1.5
-
Psych
-
升級至
Psych
3.1.0
-
RDoc
-
速度提升約 2 倍。
-
使用 SOURCE_DATE_EPOCH 來產生檔案。
-
修正方法行號偏移的問題。
-
啟用在預設標記法表示法中被忽略的
--width
、--exclude
和--line-numbers
。 -
新增對預設標記法表示法中「>>>」引用的區塊引用的支援。
-
新增對 TomDoc 表示法中「Raises」行的支援。
-
修正語法錯誤輸出。
-
修正許多剖析錯誤。
-
- REXML
-
升級至 REXML 3.1.9。請參閱 github.com/ruby/rexml/blob/master/NEWS.md。
- 改善一些 XPath 實作
-
concat()
函式:在串接之前將所有引數字串化。 -
string()
函式:支援內容節點。 -
string()
函式:支援處理指令節點。 -
在 XPath 2.0 中支援
"*:#{ELEMENT_NAME}"
語法。
-
- 修正一些 XPath 實作
-
"//#{ELEMENT_NAME}[#{POSITION}]"
案例 -
string()
函式:修正function(document)
傳回位於根元素之外的節點。 -
"/ #{ELEMENT_NAME} "
案例 -
"/ #{ELEMENT_NAME} [ #{PREDICATE} ]"
案例 -
"/ #{AXIS}::#{ELEMENT_NAME}"
案例 -
"#{N}-#{M}"
案例:"-"
前需要一個或多個空白。 -
"/child::node()"
案例 -
"#{FUNCTION}()/#{PATH}"
案例 -
"@#{ATTRIBUTE}/parent::"
案例 -
"name(#{NODE_SET})"
案例
-
-
- RSS
- 新選項
-
RSS::Parser.parse 現在接受選項為
Hash
。可用的選項有:validate
、:ignore_unknown_element
、:parser_class
。
-
- RubyGems
Set
- 別名方法
-
Set#filter!
是Set#select!
的新別名。[功能 #13784]
-
URI
相容性問題(不含功能錯誤修正)¶ ↑
目錄
-
Dir.glob
搭配以'\0'
分隔的模式清單將會被棄用,且現在會發出警告。[功能 #14643]
-
File
-
File.read
、File.binread
、File.write
、File.binwrite
、File.foreach
和File.readlines
即使路徑以直線字元'|'
開頭,也不會呼叫外部指令。[功能 #14245]
-
Object
-
Object#=~ 已被棄用。[功能 #15231]
-
標準函式庫相容性問題(不含功能錯誤修正)¶ ↑
-
這些標準函式庫已提升為預設的 gem。
-
e2mmap
-
forwardable
-
irb
-
logger
-
matrix
-
mutex_m
-
ostruct
-
prime
-
rexml
-
rss
-
shell
-
sync
-
thwait
-
tracer
-
BigDecimal
-
下列方法已移除。
-
BigDecimal.allocate
-
BigDecimal.ver
-
-
每個
BigDecimal
物件都是凍結的。[功能 #13984] -
BigDecimal() 會解析給定的字串,類似於 Float()。
-
String#to_d
會解析接收器字串,類似於String#to_f
。 -
BigDecimal.new
將會在版本 2.0 中移除。
-
Pathname
-
Pathname#read
、Pathname#binread
、Pathname#write
、Pathname#binwrite
、Pathname#each_line
和Pathname#readlines
即使路徑以管線字元'|'
開頭,也不會呼叫外部指令。這遵循 [功能 #14245]。
-
實作改善¶ ↑
-
加速
Proc#call
,因為我們不再需要關心$SAFE
。[功能 #14318]使用
Proc#call
多次的lc_fizzbuzz
基準測試,我們可以測量到 x1.4 的改善。[錯誤 #10212] -
加速 block.call,其中
block
傳遞區塊參數。[功能 #14330]Ruby 2.5 改善區塊傳遞效能。[功能 #14045]
此外,Ruby 2.6 改善傳遞區塊呼叫的效能。
-
引入 JIT(即時編譯器)編譯器的初始實作。[功能 #14235] [實驗中]
-
新增
--jit
命令列選項以啟用 JIT。--jit-verbose=1
適合用於檢查。請參閱ruby --help
以查看其他選項。 -
為了產生機器碼,這個 JIT 編譯器會使用用於建置直譯器的 C 編譯器。目前支援的編譯器有 GCC、Clang 和 Microsoft Visual C++。
-
新增
--disable-mjit-support
選項至組態。這是為了 JIT 除錯而新增的,但如果你在建置 JIT 的標頭檔時遇到錯誤,你可以使用這個選項略過建置作為解決方法。 -
在類 Unix 平台上重新實作 rb_waitpid 以維持與為 JIT 建立的程序的相容性 [錯誤 #14867]
-
-
VM 產生器腳本更新;讓產生的 VM 更最佳化。[GH-1779]
-
啟用
Thread
快取,適用於 pthreads 平台(針對Thread.new
和Thread.start
)。[功能 #14757] -
針對具有 POSIX 計時器的平台,已移除計時器執行緒。[雜項 #14937]
-
支援暫存堆積(theap)。[錯誤 #14858] [功能 #14989]
theap 是一個管理短暫記憶體物件的堆積。例如,建立一個小型且短暫的
Hash
物件快了 x2 倍。透過 rdoc 效能基準,我們測量出效能提升了 6-7%。 -
協程的原生實作(arm32、arm64、ppc64le、win32、win64、x86、amd64)可大幅提升
Fiber
的效能。[功能 #14739]
其他變更¶ ↑
-
在 macOS 上,共用函式庫不再包含 Ruby 的完整版本號碼。這消除了使用者在平台上每次微小升級時,都必須重新建置每個擴充函式庫的負擔。
- 之前
-
libruby.2.6.0.dylib
-
libruby.2.6.dylib -> libruby.2.6.0.dylib
-
libruby.dylib -> libruby.2.6.0.dylib
-
- 之後
-
libruby.2.6.dylib
-
libruby.dylib -> libruby.2.6.dylib
-
-
將 misc/*.el 檔案抽取到 github.com/ruby/elisp